【React】7.组件间的通讯

本文详细介绍了React中组件间的四种通信方式:1) 父组件通过props向子组件传递参数;2) 子组件通过回调函数向父组件传递参数;3) 兄弟组件通过公共父组件的state进行通信;4) 使用Context API实现跨组件层级的通信。通过实例代码展示了具体实现过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

组件之间经常需要共享数据,传递数据,互相调用方法等操作。这时就需要使用组件间通讯的技术。包括父子组件通讯,兄弟组件通讯。

1. 父组件向子组件传递参数

这个很简单,分两步:

  1. 父组件使用标签调用子组件时传入参数;
  2. 子组件使用props获取传过来的参数。
import React from 'react'
import ReactDOM from 'react-dom/client'

//父组件
class Parent extends React.Component {

  render() {
    return (
      <div>
        父组件
        <Child name="tom" />
      </div>
    )
  }


}

//子组件
class Child extends React.Component {

  render() {
    return (
      <div>child recieved :{this.props.name}</div>
    )
  }

}

const root = ReactDOM.createRoot(document.getElementById("root"))
root.render(<Parent />)

2. 子组件向父组件传递参数

步骤:

  1. 父组件定义一个回调函数
  2. 父组件调用子组件,并传入回调函数;
  3. 子组件收到回调函数,调用回调函数,将信息传给父组件;
import React from 'react'
import ReactDOM from 'react-dom/client'

//父组件
class Parent extends React.Component {
  state = {
    msg: null
  }

  //1.定义一个回调函数
  sendMsg = (msg) => {
    this.setState({ msg: msg })
  }

  render() {
    return (
      <div>
        父组件收到信息:{this.state.msg}
        <br />
        {/* 2.父组件将回调函数发送给子组件 */}
        <Child callback={this.sendMsg} />
      </div>
    )
  }


}

//子组件
//class Child extends Parent {
class Child extends React.Component {

  //5.事件函数,使用父组件传递过来的回调函数,并传入信息
  clickHandler = () => {
    this.props.callback(new Date().toLocaleTimeString())
  }

  render() {
    return (
      //3.子组件调用自己的事件函数
      <button onClick={this.clickHandler}>子组件向父组件发送时间</button>
    )
  }

}

const root = ReactDOM.createRoot(document.getElementById("root"))
root.render(<Parent />)

3. 兄弟组件传递参数

使用一个公共父组件的state来作为兄弟组件的共享变量,实现传递。

import React from 'react'
import ReactDOM from 'react-dom/client'

//父组件
class Parent extends React.Component {
  //初始化状态
  state = {
    count: 0
  }

  //提供一个状态改变回调函数
  onIncrement = () => {
    this.setState({ count: this.state.count + 1 })
  }


  render() {

    return (
      <div>
        {/* 调用子组件1 */}
        <Child1 count={this.state.count} />
        {/* 调用子组件2 */}
        <Child2 onIncrement={this.onIncrement} />
      </div>
    )
  }

}


//子组件1
const Child1 = (props) => {

  return (
    //使用父组件传来的值
    <div>计数器:{props.count}</div>
  )

}
//子组件2
const Child2 = (props) => {

  return (
    //调用父组件的回调函数
    <button onClick={() => props.onIncrement()} >+1</button>
  )

}
const root = ReactDOM.createRoot(document.getElementById("root"))
root.render(<Parent />)

4. 跨组件通讯

组件1调用组件2,组件2调用组件3;
想从组件1传信息给组件3,要是经过组件2中转会很麻烦。

所以,可以用context来实现:

import React from 'react'
import ReactDOM from 'react-dom/client'

//创建Context,里面名字时固定的
const { Provider, Consumer } = React.createContext();

//组件1
class Parent extends React.Component {


  render() {
    return (
      // 使用Provider传入值,任意类型的值
      // <Provider value="tom">
      <Provider value={{ name: "tom", age: 11 }}>
        <Node1 />
      </Provider>

    )
  }


}


//组件2
const Node1 = () => {
  return (
    <Node2 />
  )

}

//组件3
const Node2 = () => {

  return (
    //Consumer使用值
    <Consumer>
      {
        data => <div>node2:{data.name},{data.age}</div>
      }
    </Consumer>

  )

}

const root = ReactDOM.createRoot(document.getElementById("root"))
root.render(<Parent />)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值