前言:
之所以寫這篇文章呢姑曙,是因為我的項目中遇到的問題:
在開發(fā)整個項目之前聘芜,沒有考慮到會使用到 vuex狀態(tài)管理的這個特性梁丘,所有的操作都是靠本地存儲來實現(xiàn)的。本地存儲還是能搞定絕大多數(shù)的問題的喝噪,比如 賬號密碼以及token础嫡,都是可以存儲的,并且哪里用到那里訪問酝惧。十分的簡單有效榴鼎,但是在項目中有一個地方遇到了需要兄弟頁面(同級頁面)傳參的場景伯诬,接下來就是我們的場景的介紹了:
業(yè)務(wù)場景:
在我的支付頁面有一個選擇地址的功能,一開始拿的是默認的地址巫财,但是點擊這個地址是可以跳轉(zhuǎn)到地址選擇頁面的盗似,在地址頁面切換地址的操作要在點擊地址卡片的時候,回退到上一頁桥言,然后再把地址信息、電話葵礼、姓名攜帶到上一頁(支付頁面)并鸵。到這就會有同學(xué)講了:這個簡單,直接跳轉(zhuǎn)到上一頁就好了园担,哪里用的到 同級頁面通信 呢届谈?NONONO,你要是這樣想就大錯特錯了弯汰。我們假設(shè)一下: 從支付頁面到地址頁面通過 vue的push方法的話,支付頁面是不是在頁面棧中已經(jīng)存在了咏闪?然后我們再在地址頁面通過 push 還是replace跳轉(zhuǎn)到支付頁面嗎?回想一下鸽嫂,這樣跳轉(zhuǎn)是不是都不合理呢纵装? 反正push 這種方法可以首先排除掉, 現(xiàn)在講一下 replace 這個方法的初衷是替換掉當(dāng)前頁面据某!注意是當(dāng)前頁面橡娄,也就是我們的 地址頁面癣籽。我們是可以通過 路由跳轉(zhuǎn)傳參去實現(xiàn),但是你會發(fā)現(xiàn)你從地址頁面調(diào)回支付頁面的時候筷狼,支付頁面是不是又會在頁面棧中出現(xiàn)一次呢?這樣以來桑逝,你要回到 支付的前一個頁面 你就要點擊兩次回退按鈕,so楞遏,今天我們就要用一下我們 vue 給我們提供的 事件總線(eventBus)了首昔。
vue組件非常常見的有父子組件通信糙俗,兄弟組件通信。而父子組件通信就很簡單巧骚,父組件會通過 props 向下傳遞數(shù)據(jù)給子組件,當(dāng)子組件有事情要告訴父組件時會通過$emit事件告訴父組件劈彪。今天就說說如果兩個頁面沒有任何引用關(guān)系,該如何通信痘括。
因為我的項目的體量不是很大,這里就不說vuex了纲菌,那就可以考慮使用vue中的事件總線疮绷,即 eventBus 來通信了。
eventBus簡介:
這個事件總線冬骚,名字起得是不落俗套,但是其實呢他就是我們常說的 設(shè)計模式 的一種 發(fā)布訂閱者模式:
他是類似于我們訂購一份報紙唉韭,只要有新的報紙出版了,就會告訴我們属愤,我出版了,訂閱者自然而然就知道有一版新報紙出版了住诸。
用法:
在我們的 發(fā)布者的頁面中,我們需要把 發(fā)布信息這個操作放在 發(fā)布信息頁面的destoryed()這個生命周期里丧诺,因為,你把這個事件放在除了 deatoryed()之外的任何生命周期里驳阎,這個被銷毀的頁面總是會調(diào)用這個destoryed()這個生命周期,總是會阻斷你當(dāng)前生命周期的執(zhí)行呵晚,所以把他放在這個生命周期里是最好的,而在你訂閱者頁面的時候饵隙,你最好保證,在你訂閱生命周期里先于 發(fā)布生命周期的執(zhí)行金矛,什么意思呢?就是訂閱要發(fā)生在下一次發(fā)布之前娶耍,你品你細品,是不是這個道理伺绽?別人都發(fā)布了你再訂閱是不是你訂閱的都是之前發(fā)布的消息呢嗜湃? 所以在你的 訂閱者 on()頁面你最好在 你的 created()生命周期里訂閱澜掩,為了讓你的訂閱不出現(xiàn)多次訂閱购披,你最好在你的mounted()生命周期里把他 $off('事件名') 掉肩榕。 假如你發(fā)現(xiàn)你的訂閱老是不更新,你就檢查你到底是不是把生命周期給搞錯了?鹑椤乔妈!
新組件beforeCreate
↓
新組件created
↓
新組件beforeMount
↓
舊組件beforeDestroy
↓
舊組件destroyed
↓
新組件mounted
我是蠢蛋蝙云,還是不會請私信我路召!18848882705