前端設計模式之觀察者模式


  所謂的觀察者模式我所認為的就是訂閱發布。其中中間關於調度方法還有一點區別,這里就不多做敘述了

  接下來給大家分享下我對所謂的發布訂閱的理解吧,其實這種設計理念在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這個生命周期中明明只執行一遍但是里面因為訂閱者存在

所以他不受生命周期的影響只會被發布者控制


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM