vue使用eventBus遇到數(shù)據(jù)不更新的問題及解決
vue使用eventBus遇到數(shù)據(jù)不更新問題
今天在項目的一個組件需要向兄弟組件傳數(shù)據(jù),所以想到了使用eventBus。
我先建立了一個eventBus.js
代碼如下:
import Vue from 'vue' const eventBus = new Vue() export default eventBus
在需要往外傳值的組件中引用eventBus.js
import eventBus from '@/assets/js/eventBus'
在方法中使用$emit往外傳值
eventBus.$emit('dataUpdate',data)
在需要接受值的兄弟組件中再次引用eventBus.js
import eventBus from '@/assets/js/eventBus'
在created()周期函數(shù)里使用$on來接受其他組件傳來的值
created(){ eventBus.$on('dataUpdate', item => { this.name = item console.log(this.name) }) }
然后我就遇到了一個奇怪的事情
console.log可以打印出this.name的值,但是頁面上的name沒有任何變化,還是data()函數(shù)里的初始值。
通過查詢資料得知原來 vue路由切換時,會先加載新的組件,等新的組件渲染好但是還沒有掛載前,銷毀舊的組件,之后掛載新組件
如下所示:
新組件beforeCreate ↓ 新組件created ↓ 新組件beforeMount ↓ 舊組件beforeDestroy ↓ 舊組件destroyed ↓ 新組件mounted
注意
在$emit
時,必須已經(jīng)$on
,否則將無法監(jiān)聽到事件。
所以正確的寫法應該是在需要接收值的組件的created
生命周期函數(shù)里寫$on
,在需要往外傳值的組件的destroyed
生命周期函數(shù)函數(shù)里寫:
destroyed(){ eventBus.$emit('dataUpdate',data) }
這樣寫,在舊組件銷毀的時候新的組件拿到舊組件傳來的值,然后在掛載的時候更新頁面里的數(shù)據(jù)。
總結
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
vue3+ts import引入第三方js文件報錯的2種解決方法
這篇文章主要給大家介紹了關于vue3+ts import引入第三方js文件報錯的2種解決方法,在Vue中通常我們引入一個js插件都是使用npm方式下載然后import使用的,需要的朋友可以參考下2023-08-08Vue多層數(shù)據(jù)結構響應式失效,視圖更新失敗問題
這篇文章主要介紹了Vue多層數(shù)據(jù)結構響應式失效,視圖更新失敗問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-02-02vue 項目中的this.$get,this.$post等$的用法案例詳解
vue.js的插件應該暴露一個install方法。這個方法的第一個參數(shù)是vue構造器,第二個參數(shù)是一個可選的選項對象,首頁要安裝axios,本文結合案例代碼給大家詳細講解vue 中的this.$get,this.$post等$的用法,一起學習下吧2022-12-12