非父子組件通訊-中央事件總線

寫在前面

上一篇講了父子組件的通訊,那麼非父子組件間如何通訊呢?在vue.js 2.x中,用一個空的Vue實例做爲中央事件總線與兩個跨級組件進行通訊,在通訊的過程當中兩個跨級組件互不聯繫。vue

文章的開始

前面大概介紹了中央事件總線的過程,具體如何進行看個栗子。bash

<body>
    <div id="app">
        {{ message }}
        <component-a></component-a>
    </div>
    <script>
        var bus = new Vue();
        Vue.component('component-a',{
            template: '<button @click="handleEvent">傳遞-事件</button>',
            methods: {
                handleEvent:function () {
                    bus.$emit('on-message','來自組件commponent-a的內容');
                }
            }
        });
        var app = new Vue({
            el: '#app',
            data: {
                message: ''
            },
            mounted: function (){
                var _this = this;
                //在實例初始化時,監聽來自bus實例的事件
                bus.$on('on-message',function (msg) {
                    _this.message = msg;
                }) ;
            }
        })
    </script>
</body>
複製代碼

結果如圖所示:app

點擊傳遞事件按鈕,顯示‘來自組件commponent-a的內容’

1.經過組件建立了一個「傳遞事件」的按鈕,點擊按鈕,觸發點擊事件,執行handleEvent函數,在handleEvent函數裏面,經過bus.$emit將on-message傳遞到bus這個實例上面。

2.關於mounted這個鉤子,咱們知道el掛載到實例後調用,通常業務邏輯會從這裏開始。函數

3.當el掛載app後,在mounted的函數裏面監聽來自bus的on-message事件,因此當on-message事件傳到bus實例上後,就會執行匿名函數function,給app中data裏的message賦值。 (msg){}。頁面中再經過插值表達式將數據message顯示出來。this

文章的結束

在vue.js 2.x中,用一個空的Vue實例bus做爲中央事件總線,bus實例也能夠擴展,好比添加methods,data,computed等選項。固然還有經過父鏈和子組件索引也能夠實現組件間的通訊。spa

相關文章
相關標籤/搜索