一、前言
- React 非父子组件通信可以用中央事件管理器 ,实际上就是发布订阅模式.
二、定义中央事件管理器
let map = {}
const bus = {
subscribe: (eventName, callback) => {
if (!map[eventName]) {
map[eventName] = []
}
map[eventName].push(callback)
},
dispatch: (eventName, payload) => {
if (!map[eventName]) {
return
}
map[eventName].forEach((cb) => cb(payload))
}
}
export default bus
三、非父子组件----订阅者
import React from 'react'
import bus from './Bus.js'
export default class Brother2 extends React.Component {
state = {
isShow: true
}
componentDidMount() {
bus.subscribe('abc', (payload) => {
this.setState({
isShow: payload
})
})
}
render() {
let { isShow } = this.state
return (
<div>
{isShow ? (
<div
style={{ width: '200px', height: '200px', background: 'green' }}
/>
) : null}
</div>
)
}
}
四、非父子组件----发布者
import React, { Component } from 'react'
import bus from './Bus.js'
export default class Brother1 extends Component {
state = {
is: true
}
render() {
return <button onClick={this.isHandle}>显示/隐藏</button>
}
isHandle = () => {
this.setState(
{
is: !this.state.is
},
console.log(this.state.is)
)
bus.dispatch('abc', this.state.is)
}
}