react学习笔记3--数据双向绑定,组件通信

一、表单处理

 

1、受控组件-input元素

通过设置input元素的value值(或复选框的checked值)实现Getter,通过监听onChange事件实现Setter,从而实现数据双向绑定。

class element extends React.Component {
    state = {
        txt:"",
        checked:false
    }
    handleTxt = (e) => {
        this.setState({txt : e.target.value})
    }
    handleChecked = e => {
        this.setState({checked : e.target.checked})
    }
    render(){
        return (
            <input type='text' value={this.state.txt} onChange={this.handleTxt}>
            <input type='checkbox' checked={this.state.checked} onChange={this.handleChecked}>
        )
    }
}

多表单的优化操作:

1)给input元素加name,name=state中对应的数据名、2)统一用一个处理函数处理数据变化,函数内用e.target.name获取应该修改的状态名

class element extends React.Component {
    state = {
        txt:"",
        checked:false
    }
    handleForm = (e) => {
        let name = e.target.name
        let value = e.target.value||e.target.checked
        this.setState({[name] : value}) //!!这里要用[],否则会当作"name"字符串处理
    }
    render(){
        return (
            <input type='text' value={this.state.txt} onChange={this.handleForm}>
            <input type='checkbox' checked={this.state.checked} onChange={this.handleForm}>
        )
    }
}

2、非受控组件

二、组件通信

1、props:一个对象

import React from 'react'
import ReactDom from 'react-dom'

//函数式:porps形参
function Element1 (props){
    return (
        <p>{props.name}+{props.age}</p>
    )
}

//类式:this.props
class Element2 extends React.Component{
    render(){
        return (
            <p>{this.props.name}+{this.props.age}</p>
        )
    }
}

ReactDom.render(<Element1 name='bob' age={18}/>)
ReactDom.render(<Element2 name='bob' age={18}/>)

注:1)props可以传递任意数据类型,包括数组、对象、函数、dom结构等。2)props只读。3)在类中如果定义了constructor(props)则必须将props传入做形参,且需要在super(props)函数也传入props形参

组件间通信方式:

1)父传子:props传数据,如上

2)子传父:props传函数,通过回调函数传参方式

3)兄弟组件通信:状态提升,将共享状态的定义提升到公共父组件

2、context 跨级组件通信,祖先元素将数据传递给后代元素时使用

假设 祖先 > subComponent > 后代

1)创建两个内置组件Provider、Comsumer

const {Provider,Consumer} = React.createContext()

2)祖先元素中用Provider包裹返回值

//祖先
render(){
    return (
        <Provider value='xiaoming'>
            <div><subComponent></subComponent><div>
        </provider>
    )
}

3)后代元素用Consumer {}包裹

render(){
    return(
        <div>
            <Consumer>{ data => <p>名字是:{data}<p> }</Consumer>
        </div>
    )
}

三、props深入

1、props的children属性

当渲染组件时,组件中嵌套的内容视为children属性,可以通过props.children访问到。

嵌套的内容可以是文本、标签、组件、jsx语句、函数等

const App = (props)=>{
    props.children() //函数执行
    return (
        <div>{props.children}</div>
    )
}

// ReactDom.render(<App>这是一段文本</App>)
// ReactDom.render(<App><p>这是一个p标签</p></App>)
// ReactDom.render(<App><Children>这是一个子组件</Children></App>)
// ReactDom.render(<App>{()=>console.log("这是一个函数")}</App>)

2、props校验,需要安装 prop-types包

常用的校验规则:

 3、props默认值

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值