<g-tabs-head class="red"></g-tabs>
發生了點擊操做的圖,兩個item兄弟之間是沒有關係的,發生了點擊操做以後要作下圖中的五件事情。html
// tabs.vue這樣就有了eventBus data(){ return { eventBus: new Vue() } }, provide(){ return { eventBus:this.eventBus } }, created(){ console.log('爺爺的eventBus') console.log(this.eventBus) // this.$emit('update:selected','xxx') } // tabs-head.vie兒子就有了eventBus,其餘組件同理 inject: ['eventBus'], created(){ console.log('爺爺給爸爸的eventBus') console.log(this.eventBus) }
created(){ this.eventBus.$on('update:selected',(name)=>{ console.log(name) }) // 這句話的意思是監聽selected被更新了,而且執行一個回調,這裏監聽的多是其它的組件 }, methods: { xxx(){ this.eventBus.$emit('update:selected',this.name) // 這句話的意思是大聲喊出來selected更新了 } }
// 咱們的eventBus是g-tabs生成的new Vue(),而app.js監聽的g-tabs,是一個vue組件, // 也就是vue組件的事件,而不是new Vue() <g-tabs :selected.sync="selectedTab" @update:selected="yyy"></g-tabs> methods: { yyy(data){ console.log('yyy') console.log(data) } } // 那麼組件怎麼觸發呢 // tabs.vue created(){ this.$emit('update:selected', '這是 this $emit 出來的數據') // 這樣寫能夠觸發外面,這裏的this 就是當前組件 this.eventBus.$emit('update:selected', '這是 this event $emit 出來的數據') // 這樣寫不能夠觸發外面 } // app.js <g-tabs :selected.sync="selectedTab" @update:selected="yyy"></g-tabs> methods: { yyy(data){ console.log('yyy') console.log(data) } }
// tabs-head created(){ this.$emit('update:selected', '這是 tabs-head 拋出來的數據') // 這樣寫不能夠觸發外面是由於vue的事件系統是不會冒泡的, //若是g-tabs-head標籤是一個div那麼是能夠觸發到g-tabs的由於div是能夠冒泡的 } // index.html <g-tabs :selected.sync="selectedTab" @update:selected="yyy"> <g-tabs-head class="red"> <template slot="actions"> <button>設置</button> </template> </g-tabs-head> </g-tabs>