返回

父子组件通讯的设计与实现

前端

前言

在react开发中,组件通讯是必不可少的。组件通讯的方式有很多种, props属性是最直接方便的一种。父组件向子组件通讯时,可以通过props属性传递数据。子组件向父组件通讯时,可以通过事件触发父组件的方法。

父子组件通讯

1. props属性

props属性是react组件之间通讯最直接的方式。父组件可以通过props属性传递数据给子组件,子组件可以通过props属性接收数据。props属性是只读的,子组件不能直接修改props属性的值。

2. 事件

事件是react组件之间通讯的另一种方式。父组件可以通过事件触发子组件的方法,子组件可以通过事件触发父组件的方法。事件是异步的,这意味着当一个事件被触发时,它不会立即执行。

3. context

context是react组件之间通讯的第三种方式。context是全局的,这意味着它可以在任何组件中访问。context可以通过Provider组件和Consumer组件来使用。Provider组件提供context的值,Consumer组件消费context的值。

demo演示

1. 父组件向子组件通讯

// 父组件
class Parent extends React.Component {
  state = {
    name: '张三'
  }

  render() {
    return (
      <div>
        <h1>父组件</h1>
        <Child name={this.state.name} />
      </div>
    )
  }
}

// 子组件
class Child extends React.Component {
  render() {
    return (
      <div>
        <h1>子组件</h1>
        <p>姓名:{this.props.name}</p>
      </div>
    )
  }
}

在这个demo中,父组件通过props属性向子组件传递数据。子组件通过props属性接收数据。

2. 子组件向父组件通讯

// 父组件
class Parent extends React.Component {
  state = {
    count: 0
  }

  handleIncrement = () => {
    this.setState({
      count: this.state.count + 1
    })
  }

  render() {
    return (
      <div>
        <h1>父组件</h1>
        <p>计数:{this.state.count}</p>
        <Child onIncrement={this.handleIncrement} />
      </div>
    )
  }
}

// 子组件
class Child extends React.Component {
  render() {
    return (
      <div>
        <h1>子组件</h1>
        <button onClick={this.props.onIncrement}>+</button>
      </div>
    )
  }
}

在这个demo中,子组件通过事件触发父组件的方法。父组件通过事件触发子组件的方法。

总结

react组件通讯的方式有很多种,最直接方便的方式是props属性和事件。context是全局的,可以在任何组件中访问。