亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

vue中eventbus被多次觸發以及踩過的坑

2019-11-19 14:47:59
字體:
來源:轉載
供稿:網友

一開始的需求是這樣子的,我為了實現兩個頁面組件之間的數據傳遞,假設我有頁面A,點擊頁面A上的某一個按鈕之后,頁面會自動跳轉到頁面B,同時我希望將頁面A上的某一些參數攜帶過去給頁面B。(我知道,小參數的時候可以通過路由的params或者query去傳參數,或者大型數據可以用vuex來處理,很遺憾我到現在還沒有做很大型的項目,所以還沒有用過vuex,接下來會學習一下。)

然后我就想,這不就是不同組件之間的數據傳遞問題而已嗎?直接用bus 巴士事件來傳遞數據不就行了嗎。于是,我就很愉快地進行了。關于vue中的eventbus的使用,我之前在一篇vue中的數據傳遞中有提到過。

先給你們看一下我一開始的代碼:

實現目標:

點擊之后,bus emit事件,然后順便跳轉路由到/moneyRecord頁面。

接下來就是在MoneyRecord頁面中去on接收這個事件,然后接受參數。

// 這是頁面A的內部觸發bus事件的代碼 editList (index, date, item) {// 點擊進入編輯的頁面,需要傳遞的參數比較多。  console.log(index, date, item)  bus.$emit('get', {  item: item.type,  date: date  })  this.$router.replace({path: '/moneyRecord'}) }// moneyRecord頁面created () { //這里我將icon的list給保存下來了 bus.$on('get', this.myhandle) },methods: { myhandle (val) {  console.log(val, '這是從上個頁面傳遞過來的參數') }}

就當我欣喜若狂的時候,覺得自己只要在頁面A觸發了get事件,頁面B中就會理所當然的接受了數據。然而,結果卻不如人意,看一下下面的動圖。

主要是看“”這是從上個頁面傳來的數據這一行數據的輸出次數情況來判斷事件觸發次數。“”


不知道你有沒有發現,就是我第一次進去list頁面的時候,我隨便點擊一下list下的任何一個item,控制臺沒有輸出。但是當我第二次再點擊觸發事件的時候,就會輸出一個測試數據。再一次進去點擊,就輸出兩個數據。。。依次增加了。(控制臺上那個“這是從上個頁面傳來的數據”就是測試數據)

所以,有兩個問題。

問題:

  1. 問題1: 為什么第一次觸發的時候頁面B中的on事件沒有被觸發
  2. 問題2: 為什么后面再一次依次去觸發的時候會出現,每一次都會發現好像之前的on事件分發都沒有被撤銷一樣,導致每一次的事件觸發執行越來越多。

解決

針對問題1

這個還得從vue的生命周期說起了,我先進行了測試,就是當從頁面組件A跳轉到頁面組件B的時候,兩個組件的生命周期分別是怎么樣的,關于vue的生命周期具體每一個時期做什么事情我就不再贅述了,下面po一張vue生命周期的圖。


我自己做了實驗來驗證,這個頁面跳轉過程中,這兩個組件的生命周期的執行情況。

// 我分別在頁面A和頁面B中去添加以下代碼:beforeCreate () { console.group('%c%s', 'color:red', 'beforeCreate 創建前狀態===============組件2》') }, created () { console.group('%c%s', 'color:red', 'created 創建完畢狀態===============組件2》') }, beforeMount () { console.group('%c%s', 'color:red', 'beforeMount 掛載前狀態===============組件2》') }, mounted () { console.group('%c%s', 'color:red', 'mounted 掛載狀態===============組件2》') }, beforeUpdate () { console.group('%c%s', 'color:red', 'beforeUpdate 更新前狀態===============組件2》') }, updated () { console.group('%c%s', 'color:red', 'updated 更新狀態===============組件2》') }, beforeDestroy () { console.group('%c%s', 'color:red', 'beforeDestroy 破前狀態===============組件2》') }, destroyed () { console.group('%c%s', 'color:red', 'destroyed 破壞狀態===============組件2》') }// 另外一個組件的我就不放出來了

測試結果圖:



其實,可以通過結果清楚看到,當我們還在頁面A的時候,頁面B還沒生成,也就是頁面B中的 created中所監聽的來自于A中的事件還沒有被觸發。這個時候當你A中emit事件的時候,B其實是沒有監聽到的。

再看一下,紅色的是B頁面組件,當你從頁面A到頁面B跳轉的時候,發生了什么?首先是先B組件先created然后beforeMount接著A組件才被銷毀,A組件才執行beforeDestory,以及destoryed.

所以,我們可以把A頁面組件中的emit事件寫在beforeDestory中去。因為這個時候,B頁面組件已經被created了,也就是我們寫的$on事件已經觸發了

所以可以,在beforeDestory的時候,$emit事件。

// 修改一下A頁面中的代碼:// 這是原先的代碼 editList (index, date, item) {// 點擊進入編輯的頁面,需要傳遞的參數比較多。  console.log(index, date, item)  this.item = item.type  this.date = date  this.$router.replace({path: '/moneyRecord'}) }// 重新在data屬性內部定義新的變量,來存儲要傳過去的數據;然后: beforeDestroy () { console.log(this.highlight, '這是今年的數據', this, '看看組件銷毀之前會發生什么') bus.$emit('get', {  item: this.item,  date: this.date  }) },

接下來。看一下修改之后的效果


可以看到,就是第一次點擊list的時候,也就是第一次觸發emit事件的時候,控制太就輸出了,所以在beforeDestoryed去$emit是起到作用的,B頁面組件也監聽$on到了。

但是,好像,就是事件的觸發還是會依次增加,就是控制臺的輸出每次都有所增加了。。。

解決:

看一下github上提出的。https://github.com/vuejs/vue/issues/3399


尤大大提出了以下解決:


*就是說,這個$on事件是不會自動清楚銷毀的,需要我們手動來銷毀。(不過我不太清楚這里的external bus 是什么意思,有大神能解答一下的嗎,尤大大也提到如果是注冊的是external bus 的時候需要清除)****

所以。我在B組件頁面中添加Bus.$off來關閉。代碼如下:

// 在B組件頁面中添加以下語句,在組件beforeDestory的時候銷毀。 beforeDestroy () { bus.$off('get', this.myhandle) },

來看一下輸出的結果


t可以看到,控制臺第一次進去的時候就有輸出,而且輸出的不會逐次增加

*當然,尤大大還說可以寫一個mixin?我還不知道是什么?以后在研究一下。

總結: 所以,如果想要用bus 來進行頁面組件之間的數據傳遞,需要注意亮點,組件A$emit事件應在beforeDestory生命周期內。其次,組件B內的$on記得要銷毀。

提問時間:你們在實現頁面組件之間的數據傳遞有什么好的方法嗎?可以留言分享一下嗎?有時候雖然也可以通過從后臺獲取,但是考慮到數據只有幾個需要傳的話,就沒有必要去請求數據,我知道有的還有用vueX傳遞。還有呢?

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91久久在线观看| 91香蕉国产在线观看| 亚洲视屏在线播放| 蜜月aⅴ免费一区二区三区| 亚洲一区二区三区四区视频| 国产精品久久久久久婷婷天堂| 日韩国产中文字幕| 国产女精品视频网站免费| 操日韩av在线电影| 国产欧美欧洲在线观看| 日韩av在线影视| 国产精品一区二区三区毛片淫片| 日韩**中文字幕毛片| 国产日韩欧美在线看| 久久久久久久网站| 欧美视频一二三| 亚洲成人免费在线视频| 欧洲精品毛片网站| 久久精品99无色码中文字幕| 久久影院资源网| 国语自产精品视频在免费| 亚洲日韩欧美视频一区| 国产精品国语对白| 亚洲精品一区二区久| 欧美美最猛性xxxxxx| 91精品久久久久久久久久久久久久| 午夜精品一区二区三区在线视| 尤物九九久久国产精品的分类| 亚洲人成电影网| 亚洲国产精品网站| 中文字幕亚洲情99在线| 中文字幕欧美日韩| 国产成人鲁鲁免费视频a| 久久青草精品视频免费观看| 欧洲成人在线视频| 欧美亚洲国产视频小说| 欧美日韩免费网站| 欧美精品国产精品日韩精品| 久久成人18免费网站| 成人写真福利网| 国外视频精品毛片| 亚洲精品小视频| 国产亚洲欧美另类中文| xxx成人少妇69| 国产欧美精品一区二区三区-老狼| 亚洲性日韩精品一区二区| 国产精品久久久久久久久久小说| 日产精品久久久一区二区福利| 日韩欧美国产网站| 九九热在线精品视频| 欧美视频在线观看免费网址| 国产极品精品在线观看| 欧美福利小视频| xxxx欧美18另类的高清| 久久久久久久久网站| 久久精品男人天堂| 国产午夜精品视频免费不卡69堂| 亚洲天堂第一页| 亚洲精品美女在线观看播放| 亚洲国产精品久久久久秋霞蜜臀| 91久久国产综合久久91精品网站| 久久综合伊人77777| 国产美女精品免费电影| 不卡在线观看电视剧完整版| 中国china体内裑精亚洲片| 国产成人avxxxxx在线看| 中文字幕视频一区二区在线有码| 欧美精品久久一区二区| 亚洲女同精品视频| 国产精品免费视频久久久| 国产精品aaaa| 国内精品久久久久久久| 亚洲xxxxx| 成人啪啪免费看| 午夜精品久久久久久久99热浪潮| 中文字幕精品一区二区精品| 亚洲一区二区免费| 国产日韩在线播放| 久久综合久久88| 精品国产一区二区三区久久久狼| 午夜精品一区二区三区在线播放| 成人免费观看a| 国产精品久久久久久久久久三级| 91性高湖久久久久久久久_久久99| 毛片精品免费在线观看| 亚洲一区二区久久久久久久| 国产福利成人在线| 久久精品视频中文字幕| 成人福利在线视频| 成人黄色影片在线| 最近免费中文字幕视频2019| 亚洲国模精品私拍| 亚洲综合一区二区不卡| 久久久91精品国产| 精品色蜜蜜精品视频在线观看| 欧美日韩亚洲激情| 欧美大全免费观看电视剧大泉洋| 亚洲japanese制服美女| 国产精品欧美在线| 欧美日韩在线免费| 2019亚洲男人天堂| 欧美日韩成人在线播放| 亚洲国产精品久久久久久| 国产精品久久久久久久久免费看| 在线观看成人黄色| 国产成人精品999| 欧美日韩国内自拍| 欧美做受高潮电影o| 日韩高清电影免费观看完整| 亚洲国产成人一区| 国产三级精品网站| 日韩中文字幕欧美| 91免费看视频.| 亚洲国产精久久久久久久| 欧美成人黑人xx视频免费观看| 国产伦精品一区二区三区精品视频| 欧美一级片免费在线| 欧美激情一区二区三区成人| 91欧美精品成人综合在线观看| 国产精品免费观看在线| 成人久久久久久| 一区二区欧美日韩视频| 国产一区二区三区视频免费| 久久九九免费视频| 久久视频在线直播| 最近2019中文字幕第三页视频| 久久久久久久久久国产精品| 久久久久久久久久久av| 中文字幕日韩精品在线| 欧美日韩在线第一页| 亚洲精品国产精品自产a区红杏吧| 欧美成aaa人片在线观看蜜臀| 国产成人精品a视频一区www| 亚洲男人7777| 亚洲成人精品视频| 欧美一级片在线播放| 亚洲最大激情中文字幕| 亚洲淫片在线视频| 久久久久亚洲精品| 久久精彩免费视频| 国产成人精品999| 日韩电影免费在线观看中文字幕| 日韩欧美在线中文字幕| 91九色视频导航| 成人午夜在线视频一区| 久久91精品国产91久久跳| 中文字幕亚洲欧美在线| www.亚洲成人| 一区二区三区无码高清视频| 欧美xxxx18国产| 国内揄拍国内精品| 日韩av三级在线观看| 在线视频日韩精品| 亚洲国产精品va在线看黑人动漫| 一本大道久久加勒比香蕉| 国产精品亚洲欧美导航| 这里只有精品视频在线| 一本一道久久a久久精品逆3p| 国产成人av网| 欧美wwwxxxx| 国产噜噜噜噜噜久久久久久久久| 国产亚洲精品久久久| 免费97视频在线精品国自产拍| 欧美做受高潮电影o|