zoukankan      html  css  js  c++  java
  • React 组件传值

      React作为前端工程化的三大框架之一,有其独有的特点和优势,组件之前的通讯是必不可少的内容,废话不多说,接下来就对这个做个总结(有不足之处欢迎留言评论)。

    父组件传递数据给子组件

    • 父组件提供要传递的数据
    • 给子组件标签添加属性,值为 state 中的数据
    • 子组件中通过 props 接收父组件中要传递的数据
    class Parent extends React.Component {
      state = {
        lastName: '王'
      }
    
      render() {
        return (
          <div className="parent">
            父组件:
            <Child name={this.state.lastName} />
          </div>
        )
      }
    }
    
    const Child = (props) => {
      return (
        <div className="child">
          <p>子组件,接收到父组件的数据:{props.name}</p>
        </div>
      )
    }
    

    子组件给父组件传递的数据

    • 父组件提供一个回调函数 (用于接收数据)
    • 将该函数作为属性的值,传递给子组件
    • 子组件通过 props 调用回调函数
    • 将子组件的数据作为参数传递给回调函数
    <!-- 父组件 -->
    class Parent extends React.Component {
      state = {
        parentMsg: ''
      }
    
      getChildMsg = data => {
        console.log('接收到的子组件数据:'+data)
        this.setState({
          parentMsg:data
        })
      }
    
      render() {
        return (
          <div className="parent">
            父组件:{this.state.parentMsg}
            <Child getMsg={this.getChildMsg} />
          </div>
        )
      }
    }
    
    <!-- 子组件 -->
    class Child extends React.Component {
      state = {
        msg:"刷抖音"
      }
      handleClick = () => {
        this.props.getMsg(this.state.msg)
      }
      render(){
        return (
          <div className="child">
            子组件:<button onClick={this.handleClick}>点我,给父组件传递数据</button>
          </div>
        )
      }
    }
    

    兄弟组件传值

    • 将共享状态提升到最近的公共父组件中,由公共父组件管理这个状态

    • 思想是:状态提升

    • 公共父组件职责:提供共享状态,提供操作共享状态的方法

    class Parent extends React.Component {
      state = {
        count: 0
      }
    
      onIncrement = () => {
        this.setState({
          count:this.state.count + 1
        })
      }
    
      render() {
        return (
          <div className="parent">
            <Child1 count={this.state.count}></Child1>
            <Child2 onIncrement={this.onIncrement}></Child2>
          </div>
        )
      }
    }
    
    class Child1 extends React.Component {
      render(){
        return <h1>计数器:{this.props.count}</h1>
      }
    }
    
    class Child2 extends React.Component {
      render() {
        return <button onClick={this.props.onIncrement}>+1</button>
      }
    }
    

    Context

    • 作用:跨组件传递数据(解决了多级组件嵌套过深之间的传值)
      1. 调用 React.createContext() 创建 Provider (提供数据) 和 Consumer (消费数据) 两个组件
      2. 使用 Provider 组件作为父节点
      3. 设置 value 属性,表示要传递的数据
      4. 调用 Consumer 组件接收数据
    const { Provider, Consumer } = React.createContext()
    
    class App extends React.Component {
      render() {
        return (
          <Provider value="pink">
            <div className="app">
              <Node></Node>
            </div>
          </Provider>
        )
      }
    }
    
    const Node = props => {
      return (
        <div className="node">
          <SubNode></SubNode>
        </div>
      )
    }
    
    const SubNode = props => {
      return (
        <div className="subnode">
          <Child></Child>
        </div>
      )
    }
    
    const Child = props => {
      return <div className="child">
        <Consumer>
          {
            data => <span>我是子节点 -- {data}</span>
          }
        </Consumer>
      </div>
    }
    
    
    • 总结:
      1. 如果两个组件是多级嵌套关系,可以使用 Context 实现组件通讯
      2. Context 提供两个组件:Provider (提供数据) 和 Consumer (消费数据)
  • 相关阅读:
    vue 之循环添加不同class
    小程序 之使用HMACSHA1算法加密报文
    微信小程序 之wx.getLocation()获取地理信息中的小坑
    js 时间戳与yyyy-mm-dd或yyyy-MM-dd HH-mm-ss互相转换
    小程序 之登录 wx.login()
    打开串口(COM)号大于9时报错
    linux的mysql权限错误导致看不到mysql数据库
    Nginx报错汇总
    获取磁盘总空间和剩余空间
    关于CoCreateInstance的0x800401f0问题
  • 原文地址:https://www.cnblogs.com/aloneer/p/14944926.html
Copyright © 2011-2022 走看看