Vue 非父子組件之間的通訊

 

實現非父子組件之間的通訊,有如下幾種方式vue

  • Bus總線。建立一個空的Vue對象做爲Bus中央事件總線(中間組件)。vuex

  • vuex(適合大型項目,小項目效果不明顯)app

  • provide/inject(同根往下派發)ide

  • 本地存儲函數

 第一種是最經常使用的,此處只介紹第一種。this

 

 

bus總線實現非父子組件之間的通訊

<div id="app"></div>
        
        
    <script>
        // 建立一個空的Vue對象做爲bus中央事件總線
        Vue.prototype.$bus=new Vue();
        
        Vue.component('MyHeader',{
            template:`
                <div>
                    <p>this is the header area</p>
                    <button @click="send">向body傳遞數據</button>  <!--調用的函數能夠帶參數-->
                </div>
            `,
            methods:{
                send(){ //可帶參數
                    this.$bus.$emit("received","hello")  //觸發一個自定義事件,該事件能夠攜帶0、一、多個數據。事件、數據都放在bus總線中
                }
            }
            
        })
    
    
        Vue.component('MyBody',{
            template:`
                <div>
                    <p>this is the body area</p>
                    <p>來自header的數據:{{msg}}</p>  <!-- 展現接收到的數據 --->
                </div>        
            `,
            data(){
                return{
                    msg:''
                }
            },
            created(){  //在created(){}中寫監聽
                //寫法一
                //var self=this;  //直接用this沒效果,須要把this賦給一個臨時變量,使用臨時變量代替this
                //在bus總線中註冊一個事件監聽,當指定的事件發生時會調用對應的函數
                //self.$bus.$on('received',function(val){  //此處使用匿名函數
                //    self.msg=val; 
                //});
                
                //寫法二
                this.$bus.$on('received',val=>{  //使用ES6的箭頭函數,這種方式能夠直接使用this。更簡潔,推薦。
                    this.msg=val;
                })
            }
        })
        
            
        new Vue({
            el:'#app',
            template:`
                <div>
                    <my-header></my-header>
                    <my-body></my-body>
                </div>
            `,
        });
        
    </script>

 

 

 

說明

第一種寫法本來是這樣的:spa

this.$bus.$on('received',function(val){  
     this.msg=val; 
 });

咱們想要的是2個this都應該是指向當前組件的,這樣this.msg才能獲取到當前組件的msg變量。prototype

但實際上,第二個this(函數體中的那個this),指向的bus總線,this.$bus  當前對象已經變成了bus總線,因此要藉助一個臨時變量。code

 

 

第二種寫法:component

箭頭函數不改變做用域,2個this都是指向當前組件,能夠直接使用this。

相關文章
相關標籤/搜索