在react没有类似vue中的事件总线来解决这个问题,一是我们借助它们共同的父级组件通过代理的方式来实现,但过程会相当繁锁。react提供了Context来实现跨组件通信, 而不必显式地通过组件树的逐层传递 props。
import React, { Component, createContext } from 'react'
const {
Provider,
Consumer
} = createContext()
祖先与子孙之间的通信


组件节点
import React, { Component } from 'react'
import MyContext from '../context/Bus'
import Cmp2 from './Cmp2' export default class Cmp1 extends Component { static contextType = MyContext state = { userinfo: { username: '张三', age: 20 } } render() { return ( <div> {/* 发布一个消息 父子向下N多层的传递 祖先与后代的关系 */} <MyContext.Provider value={this.state.userinfo}> <Cmp2 /> </MyContext.Provider> </div> ) } }
子孙节点
import React, { Component } from 'react'
import MyContext from '../context/Bus'
export default class Cmp2 extends Component {
// 统一数据源中的 context中的参数据数据
// static contextType = MyContext
render() {
// console.log(this.context)
return (
<div>
{/* {this.context} */}
{/* 消费一下 */}
<MyContext.Consumer>
{
// 函数 参数就是你订阅的数据
value => (
<div>
您的姓名为:{value.username}
</div>
)
}
</MyContext.Consumer>
</div>
)
}
}
Bus.js文件
import React, { createContext } from 'react'
const db = {
user1: {
username: '张三'
},
user2: {
username: '李四'
}
}
// 如果createContext中有参数值,则表示 Provider中的没有写value值
//相当于value的默认值
// 使用默认值,可以实现平级
// Bus强一点,强在有数据 比vuex弱很多,只能获取
// export const MyContext = createContext(db.user1)
const MyContext = createContext(db.user1)
export {
db,
MyContext as default
}