React 組件通信之發(fā)布訂閱模式
React 通信
react的數(shù)據(jù)流是單向的, react 通信有以下幾種方式:
父向子通信:傳入props 子向父通信:父組件向子組件傳一個函數(shù),然后通過這個函數(shù)的回調(diào),拿到子組件傳過來的值 父向?qū)O通信:利用context傳值。React.createContext() 兄弟間通信:
2、用一些全局機制去實現(xiàn)通信,比如redux等
3、發(fā)布訂閱模式
兄弟間通信 - 發(fā)布訂閱模式
發(fā)布/訂閱模式
發(fā)布者:消息的發(fā)布者,往信道中投遞消息的對象。 訂閱者:訂閱一個或者多個信道消息的對象。 信道:每個信道都有一個名字,信道的實現(xiàn)細(xì)節(jié)對用戶代碼來說是隱藏的。
松耦合:發(fā)布者和訂閱者的通信是在用戶代碼之外處理的,通過信道降低了發(fā)布者和訂閱者的耦合性 可擴展性:發(fā)布/訂閱模式可以讓系統(tǒng)在無論什么時候都可以擴展 靈活性:不需要擔(dān)心不同的組件是如何組合在一起的
無法知道消息傳送是成功的還是失敗的,信道不會通知系統(tǒng)消息傳送的狀態(tài) 隨著訂閱者和發(fā)布者數(shù)量的增加,不斷增加的消息傳送回導(dǎo)致架構(gòu)的不穩(wěn)定,容易在負(fù)載大的時候出問題
單例模式
代碼實現(xiàn)
class?SingletonPublish?{
??constructor()?{
????this.listenList?=?{};
????this.instance?=?null;
??}
??static?getInstance()?{
????if?(!this.instance)?{
??????this.instance?=?new?SingletonPublish();
????}
????return?this.instance;
??}
??//?訂閱者添加訂閱事件
??addListen(key,?fn)?{
????if?(!this.listenList[key])?{
??????this.listenList[key]?=?[];
????}
????this.listenList[key].push(fn);
??}
??//?發(fā)布者發(fā)布消息,執(zhí)行訂閱者訂閱事件
??trigger()?{
????const?key?=?Array.from(arguments).shift();
????const?fns?=?this.listenList[key];
????if?(!fns?||?fns.length?===?0)?{
??????return?false;
????}
????fns.forEach((fn)?=>?{
??????fn.apply(this,?arguments);
????});
??}
??//?移除訂閱事件
??remove(key,?fn)?{
????const?fns?=?this.listenList[key];
????if?(!fns?||?fns.length?===?0)?return;
????if?(!fn)?{
??????this.listenList[key]?=?[];
????}?else?{
??????for?(let?l?=?fns.length?-?1;?l?>=?0;?l--)?{
????????if?(fn?===?fns[l])?{
??????????fns.splice(l,?1);
????????}
??????}
????}
??}
}
export?default?SingletonPublish.getInstance();
import?SingletonPublish?from?'../singleton-publish';
//?...
SingletonPublish.addListen('back',?()?=>?{
??console.log('get?--?back');
??SingletonPublish.remove('back',?hasExitAndVisible);
});
//?...
import?SingletonPublish?from?'../singleton-publish';
//?...
SingletonPublish.trigger('back');
//...
觀察者模式
被觀察者 觀察者
耦合問題:每個觀察者必須和被觀察對象綁定在一起,這引入了耦合 性能問題:在最基本的實現(xiàn)中觀察對象必須同步地通知觀察者。這可能會導(dǎo)致性能瓶頸。

評論
圖片
表情
