所謂的觀察者模式我所認為的就是訂閱發布。其中中間關於調度方法還有一點區別,這里就不多做敘述了
接下來給大家分享下我對所謂的發布訂閱的理解吧,其實這種設計理念在react體現在了跨組件通信中,
原理就是訂閱者寫一個函數然后不執行,接着把其儲存在某一個地方,等待着發布者去觸發這個函數,然后
達到觸發函數進行函數傳參,從而能夠達到組件之中的跨組件通信
接下來給大家分享下一個簡單的封裝
1 //第一種方式利用數組是比較啰嗦的 2 // const Observer={ 3 // arr:[], 4 // $on(event,cb){ 5 // this.arr.push({[event]:cb}) 6 // }, 7 // $emit(event,msg){ 8 // //console.log(this.arr) 9 // this.arr.forEach(item=>{ 10 // //console.log(Object.keys(item)) 11 // if(Object.keys(item)[0]===event){ 12 // item[Object.keys(item)[0]](msg) 13 // } 14 // }) 15 // } 16 // } 17 18 19 //第二種方式利用對象 20 21 //這種方式只能監聽一次 假如我們想要監聽多次可以看下下面第三種方法 22 // const Observer={ 23 // arr:{}, 24 // $on(event,cb){ 25 // this.arr[event]=cb 26 // }, 27 // $emit(event,msg){ 28 // this.arr[event](msg) 29 // } 30 // } 31 32 33 //第三種方式 多次監聽的訂閱者 34 const Observer={ 35 arr:{}, 36 //訂閱者監聽函數 37 $on(event,cb){ 38 if(this.arr[event]){ 39 this.arr[event].push(cb) 40 }else{ 41 this.arr[event]=[cb] 42 } 43 44 }, 45 //發布者觸發函數 46 $emit(event,msg){ 47 this.arr[event]&&this.arr[event].forEach(cb=>{ 48 cb(msg) 49 }) 50 }, 51 //銷毀階段 52 $delete(event){ 53 delete this.arr[event] 54 } 55 } 56 57 58 59 //以下為封裝檢驗過程 60 61 62 Observer.$on("up",(msg)=>{ 63 //訂閱者監聽函數 64 console.log(msg) 65 }) 66 Observer.$on("up",(msg)=>{ 67 //訂閱者監聽函數 68 console.log(msg) 69 }) 70 71 Observer.$delete("up") 72 73 Observer.$on("down",(msg)=>{ 74 //訂閱者監聽函數 75 console.log(msg) 76 }) 77 78 79 80 Observer.$emit("up",123)//發布者 做函數的觸發 81 82 83 Observer.$emit("down",456)//發布者 84 85 86 //這樣功能就可以實現了然后拋出使用了
所謂的發布訂閱在react中不受限制生命周期限制,比如上一邊博客說的在componentDidMount這個生命周期中明明只執行一遍但是里面因為訂閱者存在
所以他不受生命周期的影響只會被發布者控制