react第三天 子传父、表单输入、ref

day20 笔记


一、课程回顾
  • 事件(箭头函数、bind绑定)
  • props(函数props、类this.props)
  • state(setState)
  • 组件通信之父传子

二、组件通信之子传父
  • 子组件的内容
        const {changeOne } = this.props
        const {msg} = this.state
        return (
            <div className='box'>
                <h1>我是长子组件</h1>
                <button onClick={changeOne.bind(this,msg)}>点击修改父组件内容的事件</button>
            </div>
        )
    }
  • 父组件的内容
    //组件一的修改事件
    changeMsg(m){
        console.log(m,'我是被子组件触发')
        this.setState({
            msg:m
        })
    }
    <SonOne changeOne={this.changeMsg.bind(this)}></SonOne>

三、表单输入
  • 登录
//在jsx语法中 默认值 要用defaultValue去表示
//React中是单项数据流,如果我想要得到input输入框值的变化,那么我需要用onChange方法去实现,不能写成onchange
        this.state={
            userInfo:{
                name:'',
                pass:''
            }
        }
    //用户名的change事件
    changeName(e){
        //解构
        let {userInfo} = this.state 
        //取出input输入框的一个变化,把变化的值,赋值给变量
        userInfo.name = e.target.value 
        //重新给state中的userInfo赋值
        this.setState({
            userInfo
        })
    }
    //密码的change事件
    changePass(e){
        let {userInfo} = this.state
        userInfo.pass = e.target.value
        this.setState({
            userInfo
        })
    }
    //创建一个登录事件
    login(){
        let {userInfo} = this.state
        //调取登录接口
/*         axios({
            url:'/login',
            method:'post',
            data:userInfo
        })
        .then(res=>{})
        .catch(err=>{}) */
    }
<div className='box'>
                <h1>欢迎登录</h1>
                <div>
                    请输入用户名:<input type="text" defaultValue='' onChange={this.changeName.bind(this)}/>
                </div>
        <h1>{userInfo.name}</h1>
                <div>
                    请输入密码:<input type="text" defaultValue='' onChange={(event)=>this.changePass(event)}/>
                </div>
                <button onClick={this.login.bind(this)}>登录</button>
            </div>
  • 注册(封装方法)
        this.state = {
            userInfo: { //登录和注册 入参的设置要与后端一致
                name:'',
                pass:'',
                sex:0,
                hobby:[],
                job:'web',
                email:'',
                idx:'',
                remark:'',
                isGreen:false
            }
        }
//封装的公共的函数
changeInfo(e,type){
/*     let {userInfo} = this.state 
        userInfo[type] = e.target.value
        this.setState({
            userInfo
        }) */
//利用es6语法 对上述方式进行简化
        this.setState({
            userInfo:{
                ...this.state.userInfo,//取出所有的对象属性
                [type]:e.target.value//根据不同input去重新赋值
            }
        })
}
//执行事件方法的时候,要用箭头函数,bind()这个方法它是隐式传参,除了传event还要传这个类型,实参会代替event
                <div>
                    请输入用户名:<input type="text" defaultValue= {userInfo.name} onChange={(event)=>this.changeInfo(event,'name')}/>
                </div>
                <div>
                    请输入密码:<input type="text" defaultValue={userInfo.pass} onChange={(event)=>this.changeInfo(event,'pass')}/>
                </div>
  • 注册之单选框
this.state={
    userInfo:{
        sex:'0'
    }
}
                <div>
                    请选择性别:
                    <input type="radio" defaultValue='0' checked={userInfo.sex ==='0'} name='sex' onChange={(event)=>this.changeInfo(event,'sex')}/>男
                    <input type="radio" defaultValue='1' checked={userInfo.sex ==='1'} name='sex' onChange={(event)=>this.changeInfo(event,'sex')}/>女
                </div>
  • 注册之下拉框
this.state={
    userInfo:{
        job:''
    }
}
                <div>
                    请选择你的工作:
                    <select defaultValue={userInfo.job} onChange={(event) => this.changeInfo(event, 'job')}>
                        <option value="" disabled>--请选择--</option>
                        <option value="aoye">专业熬夜一百年</option>
                        <option value="tuofa">专业脱发几十年</option>
                        <option value="web">大前端攻城狮</option>
                        <option value="all">全干攻城狮</option>
                    </select>
                </div>
  • checkbox
this.state={
    userInfo:{
        isGree:false
    }
}
                <div>
                    {/* 当我点击checkbox的时候,实际上不是变更value,变更的是checked的类型 */}
                    请同意我家协议:<input type="checkbox" checked={userInfo.isGree} onChange={(event) => this.changeInfo(event, 'isGree')}/>
                </div>
//对onChange事件做条件判断
    changeInfo(e, type) {
        //type类型 我要进行一下判断,判断是取value 还是去checked
        let value = ''
        switch(type){
            case 'isGree':
                value = e.target.checked
                break;
            default:
                value = e.target.value
        }
        //利用es6语法 对上述方式进行简化
        this.setState({
            userInfo: {
                ...this.state.userInfo,//取出所有的对象属性
                [type]: value//根据不同input去重新赋值
            }
        })

    }
  • checkbox 爱好
this.state={
    userInfo:{
        hobby:[]
    },
    //设定一下爱好的数据,用来展示
            hobbies: [//需要一个选中的状态
                {
                    name: '吃吃',
                    value: 'eat',
                    checked: false
                },
                {
                    name: '睡觉',
                    value: 'sleep',
                    checked: false
                },
                {
                    name: '玩',
                    value: 'play',
                    checked: false
                },
                {
                    name: '敲代码',
                    value: 'study',
                    checked: false
                }
            ]
}
                    {/* 循环遍历我的爱好 */}
                    {
                        hobbies.map((item, index) => {
                            return <span key={item.value}>
                                <input checked={userInfo.hobby.some(i=>i===item.value)}  type="checkbox" onChange={(event) => this.changeInfo(event, 'hobby', index)} />{item.name}
                            </span>
                        })
                    }
    changeInfo(e, type, index) {
        // console.log(e,'事件')
        // console.log(type,'type')
        /*       let {userInfo} = this.state 
              userInfo[type] = e.target.value
              this.setState({
                  userInfo
              }) */
        //  console.log(e.target.checked,'checkbox')
        //type类型 我要进行一下判断,判断是取value 还是去checked
        let value = ''
        switch (type) {
            case 'hobby':
                //首先把选中的内容获取到,确定到它的索引位置
                let { hobbies } = this.state
                // console.log(hobbies[index].checked,index,'这个值是谁')
                //对选中的状态进行取反
                hobbies[index].checked = !hobbies[index].checked
                //获取所有true的状态 利用filter方法过滤出我想要的结果(选中的状态)
                let arr = hobbies.filter(item => item.checked)
                //通过循环遍历映射 生成 之后只有value的新数组
                value = arr.map(item => item.value)
                console.log(value, '选中value数据')
                //console.log(arr,'选中之后的数据')
                break;
            case 'isGree':
                value = e.target.checked
                break;
            default:
                value = e.target.value
        }
        //利用es6语法 对上述方式进行简化
        this.setState({
            userInfo: {
                ...this.state.userInfo,//取出所有的对象属性
                [type]: value//根据不同input去重新赋值
            }
        })

    }

四、ref
  • React中快速获取dom节点的方法ref
  • 第一种方法和vue很相像
                <div>
                    请输入用户名:<input ref='nameRef' type="text"/>
                </div>
                //获取input的值
                this.refs.nameRef.value 

  • 第二种方法(16版本以后才出现的 零bug,推荐这种使用放法)
constructor(){
    super()
    this.a = React.createRef()
}
<input type='text' ref={this.a} />
//取值的时候
this.a.current.内容


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
React Hooks 是 React 16.8 版本引入的一个特性,它可以让你在无需编写类组件的情况下使用状态和其他 React 特性。在 React 中,数据是自上而下流动的,也就是父组件可以通过 props 将数据传递给子组件。但是,如果子组件需要将数据传递给父组件,就需要使用回调函数来实现。 下面是一个示例,展示了如何在 React Hooks 中实现子组件向父组件传递数据: ```jsx import React, { useState } from 'react'; function ParentComponent() { const [dataFromChild, setDataFromChild] = useState(''); const handleDataFromChild = (data) => { setDataFromChild(data); }; return ( <div> <ChildComponent sendDataToParent={handleDataFromChild} /> <p>Data from child: {dataFromChild}</p> </div> ); } function ChildComponent({ sendDataToParent }) { const handleClick = () => { const data = 'Hello from child!'; sendDataToParent(data); }; return ( <button onClick={handleClick}>Send data to parent</button> ); } ``` 在上面的例子中,ParentComponent 是父组件,ChildComponent 是子组件。父组件中有一个状态变量 `dataFromChild`,并通过 `setDataFromChild` 函数来更新它。父组件将 `handleDataFromChild` 函数通过 props 传递给子组件。 子组件中有一个按钮,当点击按钮时,会调用 `handleClick` 函数,并将数据 `'Hello from child!'` 通过 `sendDataToParent` 回调函数传递给父组件。 这样,子组件就可以将数据传递给父组件了。父组件接收到子组件传递的数据后,可以在界面上展示或做其他处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值