Vue组件通信(非父子通信之Bus)

it2022-05-05  152

我的上一篇关于vue组件通信的文章链接戳这里   =>   vue组件通信,点击传值,动态传值(父传子,子传父)

今天要说的是非父子通信方式,这种跨组件的通信方式,可以通过Bus的形式进行处理。在Vue 2.x 推荐使用 个空的 Vue 实例作为中央 件总线( bus ),也就是 相当于一个中介。

比如你需要租房子 你可能会找房产中介来登记你的需求 然后中介把你的信息发给满足要求的出租者,出租者再 价和看房时间告知中介,由中介再转达给你,整个过程中 买家和卖家并没有任何交流,都是通过中间人来传话的,或者你最近可能要换房了,你会找房产中介登记你的信息订阅与你找房需求相关的资讯, 旦有符合你 房子出现时,中介会通知 ,并传达你房子 具体信息

下面的例子中你和出租者担任的就是两个跨级的组件,而房产中介就是这个中央事件总线 bus

主要传递方式大概就是下面这几步:

通过  Bus.$emit('on-message',this.abc)  的方式进行发布消息,他有两个参数,一个是消息声明,第二个是传递的值,key和value的关系

另一个组件接收通过  Bus.$on('on-message', msg => { })的方式,第一个参数是传递过来的消息声明,第二个参数可以是个函数,msg就是做为传递过来的参数

这里有个在发布者进行发布消息的时候,要在destroyed(){}生命周期中,进行销毁,并且在接收的时候$on要在created生命周期中进行获取,mounted是获取不到的,这样写,在旧组件销毁的时候新的组件拿到旧组件传来的值,然后在挂载的时候更新页面里的数据。否则传过来的值是不更新的

我们可以在bus.js中使用data,methods等选项,都是公共信息,bus.js中的data数据可以说类似于vuex中state中的数据。如果实际项目中需要存值。

当然复杂项目建议还是使用vuex。

下面是demo代码示例:

首先你要创建bus.js

import Vue from 'vue' const Bus = new Vue({ data() { return { a:'1', b:'2', c:'3', } } }) export default Bus;

page2.vue

<!-- --> <template> <div> <button @click="add">add</button> </div> </template> <script> import Bus from './bus' export default { data () { return { abc:'abc' }; }, methods: { add(){ Bus.$emit('on-message',this.abc) this.$router.push({name:'page1'}) } }, destroyed(){ Bus.$emit('on-message',this.abc) } } </script>

page1.vue

<!-- --> <template> <div> {{ message}} </div> </template> <script> import Bus from './bus' export default { data() { return { message: '1' } }, created() { console.log(Bus.a) console.log(Bus.b) console.log(Bus.c) Bus.$on('on-message', msg => { console.log('msg:' + msg) //msg:abc this.message = msg console.log('this.message:' + this.message) //this.message:abc }) }, methods: {} } </script> <style scoped> </style>

 


最新回复(0)