vue CLI_全局事件总线、消息的订阅与发布
作者:互联网
1、全局事件总线(GlobalEventBus)
-
一种组件间通信的方式,适用于任意组件间通信。
-
安装全局事件总线:
new Vue({ ...... beforeCreate() { Vue.prototype.$bus = this //安装全局事件总线,$bus就是当前应用的vm }, ...... })
-
使用事件总线:
-
接收数据:A组件想接收数据,则在A组件中给$bus绑定自定义事件,事件的回调留在A组件自身。
methods(){ demo(data){......} } ...... mounted() { this.$bus.$on('xxxx',this.demo) }
-
提供数据:
this.$bus.$emit('xxxx',数据)
-
-
最好在beforeDestroy钩子中,用$off去解绑当前组件所用到的事件。
src\components\School.vue
<template>
<div class="school">
<h3>学校名称:{{name}}</h3>
<h3>地址:{{address}}</h3>
</div>
</template>
<script>
export default {
name:"School",
data(){
return{
name:"家里蹲",
address:"某国"
}
},
methods:{
},
mounted(){
this.$bus.$on("hello",(data)=>{console.log("我是school组件,我收到了数据了",data);});
},
beforeDestroy(){
this.$bus.$off("hello");
}
};
</script>
<style scoped>
.school{
background-color:skyblue;
padding:5px;
margin-top:30px;
}
</style>
src\components\Student.vue
<template>
<div class="student">
<h3>学生姓名:{{name}}</h3>
<h3>年龄:{{age}}</h3>
<button @click="sendStudentName">把学生名给school组件</button>
</div>
</template>
<script>
export default {
name:"School",
data(){
return{
name:"张三",
age:18,
}
},
methods:{
sendStudentName(){
this.$bus.$emit("hello",this.name);
}
}
};
</script>
<style scoped>
.student{
background-color:pink;
padding:5px;
}
</style>
src\App.vue
<template>
<div class="app">
<h2>{{msg}}:{{studentName}}</h2>
<School />
<Student />
</div>
</template>
<script>
//引入School组件
import Student from "./components/Student.vue";
import School from "./components/School.vue";
export default {
name:"App",
components:{
Student,
School
},
data(){
return{
msg:"你好啊",
studentName:""
}
},
methods:{
},
}
</script>
<style scoped>
.app{
background-color:gray;
padding: 5px;
}
</style>
src\main.js
//该文件 是整个项目的入口文件
//引入Vue
import Vue from "vue";
//引入App
import App from "./App.vue";
//关闭Vue的生产提示
Vue.config.productionTip=false;
// //下面几行代码绑定x比较麻烦,可以直接用vm进行绑定
// const vueComponent=Vue.extend({});
// const vc=new vueComponent();
// Vue.prototype.$bus=vc;
//创建vm
new Vue({
render: h=>h(App),
//利用钩子进行绑定
beforeCreate(){
Vue.prototype.$bus=this;//安装全局事件总线
}
}).$mount("#app");
标签:School,vue,CLI,bus,总线,Vue,组件,name 来源: https://www.cnblogs.com/fhzmasl/p/16126993.html