这是我参与11月更文挑战的第12天,活动详情查看:2021最后一次更文挑战」
以上三种情况都可以使用消息订阅与发布机制来解决。
举个例子:
订阅报纸
很多的库都实现了这种机制,我们用主流使用较多的 PubSub
npm install pubsub-js
yarn add pubsub-js
import PubSub from 'pubsub-js';
在父组件中发布(App),在子组件中订阅 (Data)
class App extends React . Component {
componentDidMount() {
// publish 发布消息 消息名为:publish_one 内容为:This is publish
PubSub.publish("publish_one","This is publish")
}
render() {
return (
<div className = 'ArticleContainer'>
<Data/>
</div>
)
}
}
lass Data extends React.Component{
state={
publishData:''
}
componentDidMount(){
// 订阅消息 消息名:publish_one 第二个参数是一个函数
// 此函数又有两个参数:消息名和消息数据
PubSub.subscribe("publish_one",(msg,data)=>{
this.setState({publishData:data})
})
}
render(){
return(
<div>
{this.state.publishData}
</div>)
}
}
我们去GitHub中查看其文档,可以发现他将subscribe定义变量成token,这就好比定时器方法的使用一样。为了我们取消定时器/订阅。
componentDidMount(){
this.token = PubSub.subscribe('publish_one',(msg,data)=>{
this.setState({publishData:data})
})
}
为了节约资源,我们有时需要取消订阅。我们定义的token变量就有用处了
componentWillUnmount(){
PubSub.unsubscribe(this.token)
}