Vue兄弟組件之間通信 eventBus


Vue兄弟組件之間通信 eventBus

今天碰到了這個問題,兩個毫無關聯的組件之間需要通信,怎么辦!使用 props 一層一層的傳肯定是有問題的,當然可以實現,在一個就是Vuex,定義一個公共變量也是可以的,但是相對來說比較好的實現方式就是 eventBus 了吧。

其實我覺得我現在的狀態就特別好,有個志同道合的人,無論在生活還是工作上遇到問題都可以敞開了探討,沒有避諱,不管最后能不能解決,都是一種收獲!

使用

一、使用 eventBus 首先我們創建一個 bus.js 文件,里面的內容如下:

import Vue from 'vue';  
export default new Vue(); 

沒有看錯,就兩行,夠了!

二、在需要使用 eventBus 的組件中引入上面創建的 bus.js 文件。

import Bus from 'common/js/bus.js';   // 這個文件路徑寫自己的

三、發布Bus消息的組件

Bus.$emit('getTarget', event.target);   

四、接收Bus消息的組件

Bus.$on('getTarget', target => {  
    console.log(target);  
}); 

注意哈,這個其實就是發布訂閱的關系,接收消息的這一段也就是第四條,他要在頁面一加載出來就訂閱,不然發的消息可能接收不到,一般寫在 created 或者是 mounted 鈎子里面。

使用案例

兩個組件,dome01 和 demo02 ,兩個組件從 dome01 發送消息給 demo02,dome02 收到 dome01 發送的消息后展示到自己的界面上去!不使用 props 和 Vuex ,就使用 eventBus 實現。

首先創建 bus.js 文件

import Vue from 'vue';  
export default new Vue(); 

在這里插入圖片描述

編寫 dome01 組件

<template>
    <div>
        <h2>這是demo01組件</h2>
        <button @click="add"> 點擊向dome02組件發送消息 </button>
    </div>
</template>

<script>

import Bus from '../utils/bus'

export default {
    methods:{
        // 點擊按鈕發送Bus消息
        add(){
            // 發送 myMsg 主題 的Bus消息
            Bus.$emit('myMsg', "你好啊,我叫王佳偉");
            // 打印一下日志
            console.log("dome01組件發送完消息:bus事件觸發了")
        }
    }
}
</script>

在這里插入圖片描述

編寫 dome02 組件

<template>
  <div>
    <h2>這是dome02組件</h2>
    <h3>這個地方展示dome01組件的命令</h3>
    <!-- 把 dome01 發過來的消息渲染到下面 -->
    <span>{{msg}}</span>
  </div>
</template>

<script>

// 引入bus.js文件
import Bus from '../utils/bus'

export default {
  data() {
    return {
      msg: "wjw"
    };
  },
  // 在mounted鈎子里面就開始定閱myMsg主題的消息
  mounted() {
      Bus.$on('myMsg', myMsg => {  
            console.log("dome02組件收到bus消息:",myMsg);  
            this.msg = myMsg
        });  
  }
};
</script>

在這里插入圖片描述
然后添加到父組件,這個就很簡單不寫了。

跑起來看效果

在這里插入圖片描述

【案例源碼】
https://gitee.com/wjw1014/vue_learning_vuex/tree/master/src/components


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM