根據千峯教育學習視頻所練習的筆記 | 學習一段時間,我也有寫一點東西的必要了···html
<div>
裏面寫兩個組件,<dear-feifei>
和<dear-zhangliuping>
,這兩個組件就是非父子組件的關係。如今我想在在<dear-zhangliuping>
進行了一些操做,怎樣能將數據傳入到<dear-feifei>
當中。<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>vue 非父子組件通訊</title> <script src="../vue.js"></script> </head> <body> <div id="app"> <dear-feifei></dear-feifei> <dear-zhangliuping></dear-zhangliuping> </div> <script> var vm = new Vue({ el:'#app', components:{ 'dear-feifei':{ template:'<h2>{{message}}</h2>', data:function () { return{ message:'hello feifei' }; }, }, 'dear-zhangliuping':{ template:'<ul><li v-for="item in list">{{item}}</li></ul>', data:function () { return{ list:['哈哈','呵呵','吼吼'] }; }, } } }); </script> </body> </html>
<dear-zhangliuping>
組件中添加一個事件:template:'<ul><li @click="getContent" v-for="item in list">{{item}}</li></ul>',
<dear-feifei>
裏面。咱們還需在開頭建立一個空實例,就能夠調用這個實例的 $emit 添加自定義事件來進行觸發var busVm = new Vue(); //定義空實例 <script> ······ 'dear-zhangliuping':{ template:'<ul><li @click="getContent" v-for="item in list">{{item}}</li></ul>', data:function () { return{ list:['哈哈','呵呵','吼吼'] }; }, methods:{ getContent:function (ev) { busVm.$emit('changeEvents',ev.target.innerHTML); } } ······ </script>
<dear-feifei>
裏面經過生命週期進行訂閱,用mounted。在裏面用 $on 來接收事件。<script> 'dear-feifei':{ template:'<h2>{{message}}</h2>', data:function () { return{ message:'hello feifei' }; }, mounted:function () {//用於接收分發過來的數據 busVm.$on('changeEvents',function (str) { console.log(str); }); } }, </script>
mounted:function () { busVm.$on('changeEvents',function (str) { console.log(str); this.message = str; <!-- this 指向busVM這個對象,要去修正,以指向dear-feifei --> }.bind(this));//綁定之後就指向dear-feifei了 }
這樣就完成了非父子組件通訊vue
在想要接收的位置,用 $on 的方式進行接收,造成一個發佈與訂閱的模式,來實現數據的交互,就完成了非父子組件的通訊vuex
上面的方法能解決簡單的項目,但稍微複雜一點的項目咱們就用vuex的方法了app
<div>
容器裏寫兩個組件<div id="app"> <div>{{count}}</div> <addbtn></addbtn> <removebtn></removebtn> </div> <script> var busVm = new Vue(); var vm = new Vue({ el:'#app', data:{ count:0 }, components:{ 'addbtn':{ template:'<button >+</button>', }, 'removebtn':{ template:'<button >-</button>', } } }); </script>
<div id="app"> <addbtn :count="count"></addbtn> <removebtn :count="count"></removebtn> </div> <script> components:{ ····· 'addbtn':{ template:'<button >+</button>', props:['count'], </script>
<script> ······ components:{ 'addbtn':{ template:'<button @click="setCount">+</button>', props:['count'], methods:{ setCount:function () { busVm.$emit('changeEvents',this.count+1); } } }, 'removebtn':{ template:'<button @click="setCount">-</button>', props:['count'], methods:{ setCount:function () { busVm.$emit('changeEvents',this.count-1); } } } } }); </script>
var busVm = new Vue(); //定義空實例 var vm = new Vue({ el:'#app', data:{ count:0 }, mounted:function(){ busVm.$on('changeEvents',function (num) { this.count = num; }.bind(this)); },