欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

vue中eventbus被多次觸發(fā)以及踩過的坑

 更新時(shí)間:2017年12月02日 15:25:39   作者:Katherine的小世界  
這篇文章主要介紹了vue中eventbus被多次觸發(fā)以及踩過的坑,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧

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

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

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

實(shí)現(xiàn)目標(biāo):

點(diǎn)擊之后,bus emit事件,然后順便跳轉(zhuǎn)路由到/moneyRecord頁面。

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

// 這是頁面A的內(nèi)部觸發(fā)bus事件的代碼
 editList (index, date, item) {
// 點(diǎn)擊進(jìn)入編輯的頁面,需要傳遞的參數(shù)比較多。
  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, '這是從上個(gè)頁面?zhèn)鬟f過來的參數(shù)')
 }
}

就當(dāng)我欣喜若狂的時(shí)候,覺得自己只要在頁面A觸發(fā)了get事件,頁面B中就會(huì)理所當(dāng)然的接受了數(shù)據(jù)。然而,結(jié)果卻不如人意,看一下下面的動(dòng)圖。

主要是看“”這是從上個(gè)頁面?zhèn)鱽淼臄?shù)據(jù)這一行數(shù)據(jù)的輸出次數(shù)情況來判斷事件觸發(fā)次數(shù)?!啊?/p>


不知道你有沒有發(fā)現(xiàn),就是我第一次進(jìn)去list頁面的時(shí)候,我隨便點(diǎn)擊一下list下的任何一個(gè)item,控制臺(tái)沒有輸出。但是當(dāng)我第二次再點(diǎn)擊觸發(fā)事件的時(shí)候,就會(huì)輸出一個(gè)測(cè)試數(shù)據(jù)。再一次進(jìn)去點(diǎn)擊,就輸出兩個(gè)數(shù)據(jù)。。。依次增加了。(控制臺(tái)上那個(gè)“這是從上個(gè)頁面?zhèn)鱽淼臄?shù)據(jù)”就是測(cè)試數(shù)據(jù))

所以,有兩個(gè)問題。

問題:

  1. 問題1: 為什么第一次觸發(fā)的時(shí)候頁面B中的on事件沒有被觸發(fā)
  2. 問題2: 為什么后面再一次依次去觸發(fā)的時(shí)候會(huì)出現(xiàn),每一次都會(huì)發(fā)現(xiàn)好像之前的on事件分發(fā)都沒有被撤銷一樣,導(dǎo)致每一次的事件觸發(fā)執(zhí)行越來越多。

解決

針對(duì)問題1

這個(gè)還得從vue的生命周期說起了,我先進(jìn)行了測(cè)試,就是當(dāng)從頁面組件A跳轉(zhuǎn)到頁面組件B的時(shí)候,兩個(gè)組件的生命周期分別是怎么樣的,關(guān)于vue的生命周期具體每一個(gè)時(shí)期做什么事情我就不再贅述了,下面po一張vue生命周期的圖。


我自己做了實(shí)驗(yàn)來驗(yàn)證,這個(gè)頁面跳轉(zhuǎn)過程中,這兩個(gè)組件的生命周期的執(zhí)行情況。

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

測(cè)試結(jié)果圖:



其實(shí),可以通過結(jié)果清楚看到,當(dāng)我們還在頁面A的時(shí)候,頁面B還沒生成,也就是頁面B中的 created中所監(jiān)聽的來自于A中的事件還沒有被觸發(fā)。這個(gè)時(shí)候當(dāng)你A中emit事件的時(shí)候,B其實(shí)是沒有監(jiān)聽到的。

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

所以,我們可以把A頁面組件中的emit事件寫在beforeDestory中去。因?yàn)檫@個(gè)時(shí)候,B頁面組件已經(jīng)被created了,也就是我們寫的$on事件已經(jīng)觸發(fā)了

所以可以,在beforeDestory的時(shí)候,$emit事件。

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

接下來??匆幌滦薷闹蟮男Ч?/p>


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

但是,好像,就是事件的觸發(fā)還是會(huì)依次增加,就是控制臺(tái)的輸出每次都有所增加了。。。

解決:

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


尤大大提出了以下解決:


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

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

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

來看一下輸出的結(jié)果


t可以看到,控制臺(tái)第一次進(jìn)去的時(shí)候就有輸出,而且輸出的不會(huì)逐次增加

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

總結(jié): 所以,如果想要用bus 來進(jìn)行頁面組件之間的數(shù)據(jù)傳遞,需要注意亮點(diǎn),組件A$emit事件應(yīng)在beforeDestory生命周期內(nèi)。其次,組件B內(nèi)的$on記得要銷毀。

提問時(shí)間:你們?cè)趯?shí)現(xiàn)頁面組件之間的數(shù)據(jù)傳遞有什么好的方法嗎?可以留言分享一下嗎?有時(shí)候雖然也可以通過從后臺(tái)獲取,但是考慮到數(shù)據(jù)只有幾個(gè)需要傳的話,就沒有必要去請(qǐng)求數(shù)據(jù),我知道有的還有用vueX傳遞。還有呢?

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • vue 路由子組件created和mounted不起作用的解決方法

    vue 路由子組件created和mounted不起作用的解決方法

    今天小編就為大家分享一篇vue 路由子組件created和mounted不起作用的解決方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2019-11-11
  • 詳解Vue路由自動(dòng)注入實(shí)踐

    詳解Vue路由自動(dòng)注入實(shí)踐

    這篇文章主要介紹了詳解Vue路由自動(dòng)注入實(shí)踐,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • Windows系統(tǒng)下使用nginx部署vue2項(xiàng)目的全過程

    Windows系統(tǒng)下使用nginx部署vue2項(xiàng)目的全過程

    nginx是一個(gè)高性能的HTTP和反向代理服務(wù)器,因此常用來做靜態(tài)資源服務(wù)器和后端的反向代理服務(wù)器,下面這篇文章主要給大家介紹了關(guān)于Windows系統(tǒng)下使用nginx部署vue2項(xiàng)目的相關(guān)資料,需要的朋友可以參考下
    2023-03-03
  • vuex管理狀態(tài) 刷新頁面保持不被清空的解決方案

    vuex管理狀態(tài) 刷新頁面保持不被清空的解決方案

    今天小編就為大家分享一篇vuex管理狀態(tài) 刷新頁面保持不被清空的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2019-11-11
  • vue移動(dòng)端設(shè)置全屏背景的項(xiàng)目實(shí)踐

    vue移動(dòng)端設(shè)置全屏背景的項(xiàng)目實(shí)踐

    本vue移動(dòng)端項(xiàng)目設(shè)置全屏背景,關(guān)鍵是要找對(duì)文件,然后添加background屬性即可,文中通過示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-08-08
  • 淺談Vue的組件間傳值(包括Vuex)

    淺談Vue的組件間傳值(包括Vuex)

    這篇文章主要介紹了Vue的組件間傳值(包括Vuex),全文通過舉例子及代碼的形式進(jìn)行了一個(gè)簡(jiǎn)單的介紹,希望大家能夠理解并且學(xué)習(xí)到其中知識(shí)
    2021-08-08
  • vue2.0多條件搜索組件使用詳解

    vue2.0多條件搜索組件使用詳解

    這篇文章主要為大家詳細(xì)介紹了vue2.0多條件搜索組件的實(shí)現(xiàn)方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-05-05
  • 基于IView中on-change屬性的使用詳解

    基于IView中on-change屬性的使用詳解

    下面小編就為大家分享一篇基于IView中on-change屬性的使用詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-03-03
  • Vue2+Element-ui實(shí)現(xiàn)el-table表格自適應(yīng)高度的案例

    Vue2+Element-ui實(shí)現(xiàn)el-table表格自適應(yīng)高度的案例

    這篇文章主要介紹了Vue2+Element-ui實(shí)現(xiàn)el-table表格自適應(yīng)高度的案例,本文結(jié)合示例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧
    2024-06-06
  • vue項(xiàng)目中Token的使用方式

    vue項(xiàng)目中Token的使用方式

    這篇文章主要介紹了vue項(xiàng)目中Token的使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-09-09

最新評(píng)論