成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

vue非父子組件通信中eventbus被多次觸發(fā)(vue中使用eventbus踩過的坑)

CHENGKANG / 3159人閱讀

摘要:主要是看這是從上個頁面?zhèn)鱽淼臄?shù)據(jù)這一行數(shù)據(jù)的輸出次數(shù)情況來判斷事件觸發(fā)次數(shù)。總結(jié)所以,如果想要用來進行頁面組件之間的數(shù)據(jù)傳遞,需要注意亮點,組件事件應(yīng)在生命周期內(nèi)。其次,組件內(nèi)的記得要銷毀。

轉(zhuǎn)載于簡書 原文鏈接:https://www.jianshu.com/p/fde...

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

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

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

實現(xiàn)目標: 點擊之后,bus emit事件,然后順便跳轉(zhuǎn)路由到/moneyRecord頁面。
接下來就是在MoneyRecord頁面中去on接收這個事件,然后接受參數(shù)。 // 這是頁面A的內(nèi)部觸發(fā)bus事件的代碼

 editList (index, date, item) {
//  點擊進入編輯的頁面,需要傳遞的參數(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, "這是從上個頁面?zhèn)鬟f過來的參數(shù)")
    }
}
就當(dāng)我欣喜若狂的時候,覺得自己只要在頁面A觸發(fā)了get事件,頁面B中就會理所當(dāng)然的接受了數(shù)據(jù)。然而,結(jié)果卻不如人意,看一下下面的動圖。

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

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

所以,有兩個問題。

問題:

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

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

image.png 我自己做了實驗來驗證,這個頁面跳轉(zhuǎn)過程中,這兩個組件的生命周期的執(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》")
 }

// 另外一個組件的我就不放出來了

測試結(jié)果圖:

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

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

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

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

// 修改一下A頁面中的代碼:
// 這是原先的代碼
  editList (index, date, item) {
//  點擊進入編輯的頁面,需要傳遞的參數(shù)比較多。
      console.log(index, date, item)
      this.item = item.type
      this.date = date
      this.$router.replace({path: "/moneyRecord"})
    }
// 重新在data屬性內(nèi)部定義新的變量,來存儲要傳過去的數(shù)據(jù);

然后:

beforeDestroy () {
 console.log(this.highlight, "這是今年的數(shù)據(jù)", this, "看看組件銷毀之前會發(fā)生什么")
 bus.$emit("get", {
        item: this.item,
        date: this.date
      })
 },
接下來??匆幌滦薷闹蟮男Ч?p>test.gif
可以看到,就是第一次點擊list的時候,也就是第一次觸發(fā)emit事件的時候,控制太就輸出了,所以在beforeDestoryed去$emit是起到作用的,B頁面組件也監(jiān)聽$on到了。

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

解決: 看一下github上提出的。issue https://github.com/vuejs/vue/...

image.png 尤大大提出了以下解決:

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

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

// 在B組件頁面中添加以下語句,在組件beforeDestory的時候銷毀。

  beforeDestroy () {
    bus.$off("get", this.myhandle)
  },
來看一下輸出的結(jié)果

t可以看到,控制臺第一次進去的時候就有輸出,而且輸出的不會逐次增加
*當(dāng)然,尤大大還說可以寫一個mixin?我還不知道是什么?以后在研究一下。

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

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

作者:Katherine的小世界 鏈接:https://www.jianshu.com/p/fde... 來源:簡書

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/94398.html

相關(guān)文章

  • vue數(shù)據(jù)傳遞--我有特殊的實現(xiàn)技巧

    摘要:同時有一種特殊的實現(xiàn)方案。組件之間傳值有這么幾種數(shù)據(jù)傳遞方式,和特殊的。在所有實例中使用其進行數(shù)據(jù)的通信。雙多方使用同名事件進行溝通。數(shù)據(jù)非長效數(shù)據(jù),無法保存,只在后生效。這樣約定的好處是,我們能夠記錄所有中發(fā)生的改變。 前言 最近碰到了比較多的關(guān)于vue的eventBus的問題,之前定技術(shù)選型的時候也被問到了,vuex和eventBus的使用范圍。所以簡單的寫一下。同時有一種特殊的實...

    xiaoxiaozi 評論0 收藏0
  • 整理4種Vue組件通信方式

    摘要:整理種組件通信方式重點是梳理了前兩個父子組件通信和通信我覺得文檔里的說明還是有一些簡易我自己第一遍是沒看明白。第四種通信方式利用比較復(fù)雜可以單獨寫一篇 整理4種Vue組件通信方式 重點是梳理了前兩個,父子組件通信和eventBus通信,我覺得Vue文檔里的說明還是有一些簡易,我自己第一遍是沒看明白。 父子組件的通信 非父子組件的eventBus通信 利用本地緩存實現(xiàn)組件通信 Vuex...

    MingjunYang 評論0 收藏0
  • vue8種組件通信方式, 值得收藏!

    摘要:一父組件通過的方式向子組件傳遞數(shù)據(jù),而通過子組件可以向父組件通信。而且只讀,不可被修改,所有修改都會失效并警告。 之前寫了一篇關(guān)于vue面試總結(jié)的文章, 有不少網(wǎng)友提出組件之間通信方式還有很多, 這篇文章便是專門總結(jié)組件之間通信的 vue是數(shù)據(jù)驅(qū)動視圖更新的框架, 所以對于vue來說組件間的數(shù)據(jù)通信非常重要,那么組件之間如何進行數(shù)據(jù)通信的呢?首先我們需要知道在vue中組件之間存在什么樣...

    BicycleWarrior 評論0 收藏0
  • vue -- 父子組件傳值,事件總線(eventbus)的使用方式

    摘要:我的個人博客地址資源地址非父子組件傳值,事件總線的使用方式我的博客地址如果您對我的博客內(nèi)容有疑惑或質(zhì)疑的地方,請在下方評論區(qū)留言,或郵件給我,共同學(xué)習(xí)進步。 歡迎訪問我的個人博客:http://www.xiaolongwu.cn 前言 先說一下什么是事件總線,其實就是訂閱發(fā)布者模式; 比如有一個bus對象,這個對象上有兩個方法,一個是on(監(jiān)聽,也就是訂閱),一個是emit(觸發(fā),也就...

    zone 評論0 收藏0
  • 前端面試匯總VUE(二)

    摘要:采用了新舊的對比,獲取差異的,最后一次性的更新到真實上。對基本屬性進行監(jiān)聽對對象進行監(jiān)聽對對象某一個屬性監(jiān)聽監(jiān)聽自定義指令全局指令,第一個參數(shù)是指令名,第二個參數(shù)是一個對象,對象內(nèi)部有個的函數(shù),函數(shù)里有這個參數(shù),表示綁定了這個指令的元素。 11.vue 虛擬DOM的理解 Web界面由DOM樹(樹的意思是數(shù)據(jù)結(jié)構(gòu))來構(gòu)建,當(dāng)其中一部分發(fā)生變化時,其實就是對應(yīng)某個DOM節(jié)點發(fā)生了變化,??...

    Sanchi 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<