React组件通信

通信方式:

  • 父子组件之间

  • 兄弟组件之间(变量提升)

  • 跨组件层级

 1,父子通讯

React组件通信

 父组件通过自定义属性传递,子组件通过props接收:

        父组件:

<子组件标签 自定义属性1={值1} 自定义属性2={值2} .... />

       子组件-函数式组件-接收数据

// 接收数据: 函数组件需要通过补充形参来获取
function 子组件(props) {
  console.log('从父组件中传入的自定义属性被收集在对象:', props)
  return (<div>子组件的内容</div>)
}

         子组件-类组件-接收数据

// 接收数据: class 组件需要通过 this.props 来获取
class 子组件 extends Component {
  console.log('从父组件中传入的自定义属性被收集在对象:', this.props)
  render() { return (<div>子组件的内容</div>) }
}

props的三个注意事项:

  1. 可以传递任意数据(数字, 字符串, 布尔类型, 数组, 对象, 函数, jsx )
  2. 只读的
  3. 单向数据流 (父组件的数据更新会流动到子组件,不能反过来,子组件直接去修改父组件的数据

children属性:不通过属性值传递,而是通过标签里的内容传递。

  • children属性:表示该组件的子节点,只要组件有子节点,props就有该属性

  • children 属性与普通的props一样,值可以是任意值(文本、React元素、组件,甚至是函数)

 

 2,子传父:

        父组件传值可以是任何对象,所以当父组件利用回调函数提供回调,子组件通过调用 this.props.函数名将数据作为参数传给父组件。

子组件:

React组件通信

 父组件: React组件通信

 

3,兄弟传值(状态提升)

    a,什么是状态提升:

        在 React 中,将多个组件中需要共享的 state 向上移动到它们的最近共同父组件中,便可实现共享 state。这就是所谓的“状态提升”。

    b,思路:

React组件通信

    c,落地代码:

    parent:

import React, { Component } from 'react'
import ReactDOM from 'react-dom'
import Jack from './Jack'
import Rose from './Rose'
class App extends Component {
  // 1. 状态提升到父组件
  state = {
    msg: '',
  }
  render() {
    return (
      <div>
        <h1>我是App组件</h1>
        <Jack say={this.changeMsg}></Jack>
        {/* 2. 把状态给子组件显示 */}
        <Rose msg={this.state.msg}></Rose>
      </div>
    )
  }
  changeMsg = (msg) => {
    this.setState({
      msg,
    })
  }
}

// 渲染组件
ReactDOM.render(<App />, document.getElementById('root'))

 Son1:

import React, { Component } from 'react'

export default class Jack extends Component {
  render() {
    return (
      <div>
        <h3>我是Jack组件</h3>
        <button onClick={this.say}>说</button>
      </div>
    )
  }
  say = () => {
    this.props.say('you jump i look')
  }
}

Son2:

import React, { Component } from 'react'

export default class Rose extends Component {
  render() {
    return (
      <div>
        <h3>我是Rose组件-{this.props.msg}</h3>
      </div>
    )
  }
}

上一篇:Vue component+vuedraggable拖拽动态表单


下一篇:POJ - 3037-Skiing(邻接表+Dijkstra)