react父子、子父、兄弟通信方法

本文介绍了React中组件间的通信方式,包括父子通信(父组件通过属性传递数据,子组件通过props接收但不能修改),子父通信(父组件通过方法传递给子组件,子组件调用该方法改变父组件状态),以及兄弟组件通信(利用EventHub机制,一方监听事件,另一方触发事件来实现状态同步)。

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

父子通信

  1. 父组件定义一个状态数据
  2. 调用子组件的时候,将数据通过属性的方式传给子组件
  3. 子组件通过this.props的方式接收
  4. 但是不能对传递过来的属性进行修改

父组件

export default class Todos extends Component {
    state = {
        list:["a","b","c"]
    }
    render() {
        let {list} = this.state;
        return (
            <div>
                <List list={list}/>
            </div>
        )
    }
}

子组件

export default class List extends Component {
    render() {
        let {list} = this.props;
        return (
            <ul>
                {
                    list.map((item,index)=>{
                    return <li key={index}>{item}</li> 
                    })
                }
            </ul>
        )
    }
}

子父通信

  1. 父组件需要定义一个状态
  2. 父组件需要定义一个修改自身状态的方法
  3. 在调用子组件的时候通过属性将方法传给子组件
  4. 子组件通过this.props.xxx触发父组件的修改状态的方法

父组件

export default class Todos extends Component {
    state = {
        list:["a","b","c"],
    }

    add = value =>{
        this.setState({
            list:[...this.state.list,value]
        })
    }

    render() {
        let {list} = this.state;
        return (
            <div>
                <Input add={this.add}/>
                <List list={list}/>
            </div>
        )
    }
}

子组件

export default class Input extends Component {

    handleKeyUp = e => {
        if(e.keyCode === 13){
            this.props.add(e.target.value)
            e.target.value = ""
        }
    }

    render() {
        return (
            <input onKeyUp={this.handleKeyUp}/>
        )
    }
}

兄弟组件

  1. 通过EventHub的机制.on绑定事件,通过trigger进行事件触发
  2. 在兄弟一组件中创建更改自身状态的方法
  3. 在componentDidMunt钩子函数中通过EventHub.on(‘绑定第事件’,触发的方法)监听绑定事件
  4. 在兄弟二组建中通过EventHub.trigger(“触发的绑定事件”,兄弟一更改状态方法的形参)触发绑定事件(订阅过程)
  5. 【注】兄弟事件都需要引入event_hub.js文件

兄组件

export default class One extends Component {
    state = {
        color:"red"
    }

    setColor = (color)=>{
        this.setState({
            color
        })
    }

    componentDidMount(){
        //需要监听事件
        EventHub.on("change",this.setColor)
    }


    render() {
        return (
            <div>
                <p style={{background:this.state.color}}>One</p>
            </div>
        )
    }
}

弟组件

export default class Two extends Component {

    randomHexColor() { //随机生成十六进制颜色
        return '#' + ('00000' + (Math.random() * 0x1000000 << 0).toString(16)).substr(-6);
    }

    changeColor = ()=>{
        //需要让One组件的change事件进行触发(订阅过程)
        EventHub.trigger("change",this.randomHexColor())
    }
    render() {
        return (
            <div>
                Two -- <button onClick={this.changeColor}>点击变色</button>
            </div>
        )
    }
}

加粗样式event_hub.js文件

let callbackLists = {}
let eventHub = {
    trigger(eventName, data) {
        let callbackList = callbackLists[eventName]
        if (!callbackList) {
            return
        }
        for (let i = 0; i < callbackList.length; i++) {
            callbackList[i](data)
        }
    },
    on(eventName, callback) {
        if (!callbackLists[eventName]) {
            callbackLists[eventName] = [] // {change:[callback,callback2]}
        }
        callbackLists[eventName].push(callback)
    }
}

export default eventHub

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值