发布订阅模式
发布订阅模式定义了一种一对多的依赖关系,让多个订阅者对象同时监听某一个主题对象。这个主题对象在自身状态变化时,会通知所有订阅者对象,使它们能够自动更新自己的状态。有时候,你想监听一种状态,当在某种情况下,触发它,然后做一些相应的事,有点儿类似我们的自定义事件。订阅发布,也是解决这一类问题的利器。
我一般用到发布订阅者模式的时候,是在比如,父子传值,兄弟传值没办法满足我的需求,我需要在这个页面操作,要改变另一个不相关的页面里面的数据,这时候就用到发布订阅模式。
用法
pubsub-js
publish:发布
subscribe:订阅
1、下载,要依赖于pubsub-js模块
cnpm install pubsub-js --save
2、import pubSub from "pubsub-js"
使用:发布
pubSub.publish("消息名称",“消息的内容”);
订阅者:订阅
pubSub.subscribe("消息名称",function(name,context){})
例子:
one组件中
<input type="button" value={"发布订阅者模式"} onClick={this.sendMsg}/>
sendMsg(){
pubSub.publish("haha","我是发布消息的内容","hkhj")
pubSub.publish("two","我是第二个发布者")
}
componentDidMount(){
pubSub.subscribe("two",(name,context)=>{
console.log("asfa",context)
})
pubSub.unsubscribe("two");//取消订阅者接收two的消息
}
two组件中
componentWillMount(){
//发布-订阅者的模式是一对多的模式,一个发布者,多个订阅者可以接收,一个订阅者,接收一个发布者
//订阅者,pubSub.subscribe第一个参数是消息名称要和发布消息名称一致才可以接受,第二个是接受参数时候收到的回调函数,接受数据时候回触发
//函数的第一个参数是消息名称,第二个是消息内容,没有第三个参数,第三参数是undefined,相传多个参数用对象在第二个参数传
pubSub.subscribe("haha",(name,context,aaa)=>{
console.log("订阅者",name,context,aaa);
})
}
pubsub多次调用解决
publish("消息名称",“消息的内容”);
//发布一个自定义的事件
subscribe(eventName, callback);
//接收一个自定义的事件,在接收的时候eventName要和发布的名称保持一致才能接收到。
unsubscribe(eventName, callback);
//解除一个自定义的事件
subscribeOne(eventName, callback);
//发布一个只触发一次的自定义事件
notify(eventName, callback);
//触发已经发布的自定义事件
上面是关于pubsub的API,我们需要在我们每次接受数据pubsub.subscribe的时候,先执行pubsub.unsubscribe操作就好了,就完美解决了,这样你接收以后的callback只执行一次。
pubsub.unsubscribe('aa');
pubSub.subscribe("aa",(name,context,aaa)=>{
console.log("订阅者",name,context,aaa);
})