解決vue bus.$emit觸發第一次$on監聽不到問題
$emit與emit與emit與 $on的用法
新建bus.js
import Vue from ’vue’
export const bus = new Vue()
引用bus.js
import {bus} from ’./bus’bus.$on(’test’, function (msg) { console.log(msg)}) bus.$emit(’test’, 11)
bus.$emit觸發第一次emit觸發第一次emit觸發第一次 $on監聽不到
因為$emit 先于 $on 執行了,VUE并沒有儲存監聽事件,所以無法監聽到數據。
我這里遇到的是在調用$emit的時候子組件并沒有創建,所以無法監聽到數據,子組件創建之后,便可以監聽到傳遞過來的數據
我的解決方法是在調用$emit的時候使用emit的時候使用emit的時候使用 $nextTick()方法
用法:將回調延遲到下次 DOM 更新循環之后執行。在修改數據之后立即使用它,然后等待 DOM 更新。它跟全局方法 Vue.nextTick 一樣,不同的是回調的 this 自動綁定到調用它的實例上。
new Vue({ // ... methods: { // ... example: function () { // DOM 還沒有更新 this.$nextTick(function () { // DOM 現在更新了 bus.$emit(’test’, 11) }) } }})
避免路由跳轉多個組件重復監聽,只需要在路由跳轉之前移除當前組件監聽事件即可:
beforeDestroy () { // 銷毀監聽事件 this.$bus.$off(’test’) }
補充知識:組件之間使用this.$bus.$on傳值之前需要先this.$bus.$off注銷事件
this.$bus是全局變量
a、b是兩個父組件,c是子組件。
c頁面觸發事件:
this.$bus.$emit(event)
a、b頁面監聽c組件的事件
pagea:
this.$bus.$on(event, () => { this.status = ’reserve’})
pageb:
this.$bus.$on(event, () => { this.status = ’buying’})
如果在調用了a頁面之后,再調用b頁面,回導致this.status是reserve而不是我們想要的buying。
正確寫法:
pagea:
this.$bus.$off(event).$on(event, () => { this.status = ’reserve’})
pageb:
this.$bus.$off(event).$on(event, () => { this.status = ’buying’})
以上這篇解決vue bus.$emit觸發第一次$on監聽不到問題就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持好吧啦網。
相關文章: