全局事件总线
全局事件总线:任意组件间通信
安装全局事件总线
new Vue({
……
beforeCreate(){
Vue.prototype.$bus=this
},
……
})
使用事件总线
接收数据:A组件想接收数据,则在A组件中给$bus绑定自定义事件,事件的回调留在A组件自身。
methods(){
demo(data){
}
mounted(){
this.$bus.$on('xxx',this.demo)
}
}
提供数据:this. b u s . bus. bus.emit(‘xxx’,this.demo)
注意
最好在beforeDestroy钩子中,用$off去解绑当前组件所用到的事件。
ToDoList中的实践
通过全局事件总线实现item给app传值。
- 安装全局事件总线
import Vue from 'vue'
import App from './App.vue'
// 关闭vue的生产提示
Vue.config.productionTip = false;
new Vue({
el: '#app',
render: h => h(App),
beforeCreate() {
Vue.prototype.$bus = this
}
})
- App.vue与MyList.vue中的操作
App.vue取消给List传的方法,MyList取消props接收的方法
- Item给App传递数据
app收数据,app绑定事件总线的自定义事件
mounted() {
this.$bus.$on('checkTodo', this.checkTodo)
this.$bus.$on('deleteTodo', this.deleteTodo)
},
beforeDestroy() {
this.$bus.$off('checkTodo')
this.$bus.$off('deleteTodo')
}
- 触发
methods: {
handleCheck(id) {
this.$bus.$emit('checkTodo',id)
},
handleDelete(id) {
if (confirm('确定删除吗?')) {
this.$bus.$emit('deleteTodo', id)
}
}
},
this.$bus.$emit('deleteTodo', id)
}
}
},