Vue全局事件总线
全局事件总线
·
全局事件总线,是组件间的一种通信方式,适用于任何组件间通信。
它的原理是给 Vue 的原型对象上面添加一个属性,这样的话所有组件的都可以访问到这个属性,然后通过这个属性可以访问到其他组件给这个属性绑定的一些方法,从而去传递数据。
使用
下面以同级组件间的传值为例
先在main.js中安装全局事件总线,此时Vue的原型对象便有了$bus属性
//引入Vue
import Vue from 'vue';
//引入App
import App from './App';
//关闭vue的生产提示
Vue.config.productionTip = false
//创建vm
new Vue({
el: "#app",
render: h => h(App),
beforeCreate() {
Vue.prototype.$bus = this//安装全局事件总线
}
})
Employee组件
<template>
<div class="employee">
<h2>员工姓名:{{name}}</h2>
<h2>员工年龄:{{age}}</h2>
</div>
</template>
<script>
export default {
name:"Employee",
data(){
return {
name:"张三",
age:25
}
},
mounted(){
//将自定义事件“demo”绑定到$bus属性上
this.$bus.$on("demo",(data) => {
console.log("Employee组件监听demo,接收数据:",data);
})
},
beforeDestroy() {
this.$bus.$off("demo");
}
}
</script>
Company组件
<template>
<div class="company">
<h2>公司名称:{{name}}</h2>
<h2>公司地址:{{address}}</h2>
<button @click="sendMessage">点我发送</button>
</div>
</template>
<script>
export default {
name:"Company",
data(){
return {
name:"五哈技术有限公司",
address:"上海宝山"
}
},
methods:{
//点击事件内部通过$emit触发自定义的“demo”事件,并通过传参将值传过去
sendMessage(){
console.log("Company组件发送数据:",this.name);
this.$bus.$emit("demo",this.name);
}
}
}
</script>
在这个例子中,子组件Company和Employee之间通过全局数据总线进行数据传递。
$bus
定义在Vue.prototype
,因此$bus
对所有组件可见,即所有组件可通过this.$bus
访问。
$bus
被赋值为this
,即vm
实例,因此$bus
拥有vm
实例上的所有属性和方法,如$emit
、$on
、$off
等
更多推荐
已为社区贡献1条内容
所有评论(0)