美文网首页
React进阶组件--props、组件通讯(React学习笔记_

React进阶组件--props、组件通讯(React学习笔记_

作者: 小王子__ | 来源:发表于2021-11-18 10:49 被阅读0次
    React进阶组件
    组件的props、组件通信
    组件的props

    组件是封闭的,要接收外部数据应该通过props来实现。

    • props的作用:接收传递给组件的数据
    • 传递数据:给组件标签添加属性
    • 接受数据:函数组件通过参数props接收数据,类组件通过this.props接收数据
    // 函数组件
    function Hello(props) {
      return (
        <div>接收到的数据: {props.name}</div>
      )
    }
    
    // 类组件
    class Hello extends React.Component {
      render() {
        return (
          <div>接收到的数据:{this.props.name}</div>
        )
      }
    }
    
    class App extends React.Component {
      render() {
        return (
           <Hello name="xiaowang" age={18}/>
        )
      }
    }
    
    • props是只读的对象,只能读取属性的值,无法修改对象
    • 使用类组件的时候,如果写了构造函数,应该将props传递给super(),否则,无法再构造函数中获取到props
    class Hello extends React.Component {
      constructor() {
        super()
        console.log('props======>', this.props)
      }
      render() {
        return (
          <div>接收到的数据:{this.props.name}</div>
        )
      }
    }
    class App extends React.Component {
      render() {
        return (
          <Hello name="xiaowang" age={18}/>
        )
      }
    }
    
    image

    以上代码,推荐使用:

    constructor(props) {
      super(props)
      console.log('props======>', props)
    }
    
    组件通信
    • 1, 父传子
    • 2,子传父
    • 3,兄弟传值
    • 4,跨组件传递数据
    1,父传子

    1,父组件提供要传递的state数据

    2,给子组件标签添加属性,值为state中的数据

    3,子组件中通过props接收父组件传递的数据

    // 父组件
    class Parent extends React.Component {
      render() {
        return (
          <div>父组件:<Child name="老王"/></div>
        )
      }
    }
    // 父组件也可以直接写要传递的数据
    class Parent extends React.Component {
      state = {
        name: '老王'
      }
      render() {
        return (
          <div>父组件:{this.state.name}<Child name={this.state.name}/></div>
        )
      }
    }
    
    // 子组件
    const Child = props => {
      return (
        <div>子组件接收到父组件传递过来的数据: {props.name}</div>
      )
    }
    
    2,子传父

    利用回调函数:父组件提供回调函数,子组件调用,将要传递的数据作为回调函数的参数。同vue一样

    // 父组件
    class Parent extends React.Component {
      // 提供回调函数
      state = {
        msg: ''
      }
      getChildMsg = data => {
        this.setState({msg: data})
      }
      render() {
        return (
          <div>父组件接收到子组件传递过来的数据为:{this.state.msg}<Child getMsg={this.getChildMsg}/></div>
        )
      }
    }
    
    // 子组件
    class Child extends React.Component {
      handleClick = () => {
        // 子组件调用父组件传递过来的回调函数
        this.props.getMsg('哈哈哈')
      }
      render() {
        return (
          <div>子组件:<button  onClick={this.handleClick}>点击给父组件传递数据</button></div>
        )
      }
    }
    
    兄弟通信

    思想就是:状态提升

    • 将共享的数据(状态)提升到最近的公共父组件,由父组件管理这个状态
    • 公共父组件职责:1,提供共享状态 2,提供操作共享状态的方法
    • 要通讯的子组件只需通过props接收状态或操作状态的方法
    // 父组件
    class Parent extends React.Component {
      // 父组件提供状态
      state = {
        message: '父组件的message'
      }
      // 提供修改状态的方法
      changeMsg = () => {
        this.setState({
          message: this.state.message + '哈哈哈哈哈'
        })
      }
      render() {
        return (
          <div>
            <Child1 msg={this.state.message}/>
            <Child2 getMsg={this.changeMsg}/>
          </div>
        )
      }
    }
    
    // 子组件1
    const Child1 = props => {
      return <h1>子组件1: {props.msg}</h1>
    }
    
    // 子组件2
    const Child2 = props => {
      return <h1>子组件2: <button onClick={() => props.getMsg()}>点击</button></h1>
    }
    
    4,跨组件传递数据 - Context

    使用步骤:1,调用React.createContext()创建Provider(提供数据)和Consumer(消费数据)两个组件

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

    2,使用 Provider 组件作为父节点

    <Provider>
      <div>
        <Child/>
      </div>
    </Provider>
    

    3,设置value属性,表示要传递的数据

    <Provider value="传递的value值">
    

    4, 调用Consumer组件接收数据

    <Consumer>
      {data => <span>data参数表示接收到的数据-{data}</span>}
    </Consumer>
    

    示例:

    class Grandfather extends React.Component{
      render() {
        return (
          <Provider value="祖父组件的value值">
            <div>
              祖父组件:<Parent/>
            </div>
          </Provider>
        )
      }
    }
    
    const Parent = props => {
      return (
        <div>
          父组件:<Son/>
        </div>
      )
    }
    
    const Son = props => {
      return (
        <div>
          儿子组件:<Grandson/>
        </div>
      )
    }
    
    const Grandson = props => {
      return (
        // <Consumer>
        //   {data => (<div>
        //     孙子组件 === 接收到来自祖父传递的数据:{data}
        //   </div>)}
        // </Consumer>
        <div>
          孙子组件====接收到来自祖父传递来的数据
          <Consumer>
            {data => <span style={{color: 'red'}}>为:{data}</span>}
          </Consumer>
        </div>
      )
    }
    
    image

    相关文章

      网友评论

          本文标题:React进阶组件--props、组件通讯(React学习笔记_

          本文链接:https://www.haomeiwen.com/subject/tbedtrtx.html