Vue组件数据共享EventBus实现

简介: Vue组件数据共享EventBus实现

在使用框架开发中,我们会经常接触到组件这个东西,组件通信也是组件中经常接触到的, 组件通信的方案有很多,我们今天来实现一下EventBus组件通信方式

EventBus被称为事件总线,我们可以把他当做组件通信的中央集中站,我们通过注册,发送,接收事件等方法实现组件的互相沟通,不过我们需要注意的是,由于EvnentBus中注册,接收,发送等方法无法捕获事件来源或去向,所以很容易造成难以维护的惨状。

EventBus的实现

首先我们在Vue项目入口文件mian.js中创建一个EventBus事件总线并挂载在Vue原型上,以此我们可以进行使用或者监听

//mian.js
import Vue from 'vue'
Vue.prototype.$EventBus=new Vue();

这里的EventBus只不过是一个名字,你也可以把他换成其他名字

我们创建完事件中心之后,我们来注册并发送事件,注册发送事件需要使用$emit方法,我们在home组件中通过div元素绑定一个sending方法,通过this获取到挂载到原型上的EventBus事件总线,通过$emit方法进行注册发送出一个全局事件,在$emit发送事件时,第一个参数是自定义发送的事件名,第二个参数是一个函数,函数中写你发送出去的数据等等操作,这里我们返回出去一个对象

// home组件
<template>
  <div >
  <div @click="sending">发送事件</div>
  </div>
</template>
<script>
export default {
  name: '',
  data() {
    }
  },
  methods: {
      sending() {
      this.$EventBus.emit('onSend', function() {
        //事件发送出去的数据等操作
        return {
          name: '若水在这里等你'
        }
      })
    },
  },
}
</script>

我们在index组件中接收一下EventBus事件中心发送出去的onSend事件,我们通过$on去接收$emit发送出来的事件,$on方法接收两个参数,第一个参数是接收的自定义事件名,第二个参数是一个函数,函数中的形参是$emit方法发送过来的数据,我们拿到数据之后就可以进行操作了

//index组件
<template>
  <div >
  </div>
</template>
<script>
export default {
  data() {
    }
  },
    mounted() {
      this.receive()
    },
  methods: {
         receive(){
      this.$EnevntBus,$on('onSend',function(value){
        console.log('接收到的数据',value);
      })
    }
    },
  },
}
</script>

这里会出现一个问题,那就是我们从home组件中发送了一个onSend事件,在index组件中接收,如果我们这个时候离开index组件重新进入则会再次触发$on监听的onSend事件,这是因为我们并没有将事件中心发送的事件进行卸载,这个时候我们需要在index组件中设置离开当前页面卸载当前页面使用到的所有事件中心自定义事件,我们通过$off方法进行卸载,$off方法接收一个参数,这个参数是我们在事件中心注册的事件名,我们离开页面进行卸载,这样就不会出现这样的问题了

beforeDestroy(){
    this.$EnevntBus.$off("onSend")
  }

坚持努力,无惧未来!


相关文章
|
20天前
|
缓存 JavaScript 前端开发
vue学习第四章
欢迎来到我的博客!我是瑞雨溪,一名热爱JavaScript与Vue的大一学生。本文介绍了Vue中计算属性的基本与复杂使用、setter/getter、与methods的对比及与侦听器的总结。如果你觉得有用,请关注我,将持续更新更多优质内容!🎉🎉🎉
34 1
vue学习第四章
|
20天前
|
JavaScript 前端开发
vue学习第九章(v-model)
欢迎来到我的博客,我是瑞雨溪,一名热爱JavaScript与Vue的大一学生,自学前端2年半,正向全栈进发。此篇介绍v-model在不同表单元素中的应用及修饰符的使用,希望能对你有所帮助。关注我,持续更新中!🎉🎉🎉
28 1
vue学习第九章(v-model)
|
19天前
|
JavaScript 前端开发 开发者
vue学习第十章(组件开发)
欢迎来到瑞雨溪的博客,一名热爱JavaScript与Vue的大一学生。本文深入讲解Vue组件的基本使用、全局与局部组件、父子组件通信及数据传递等内容,适合前端开发者学习参考。持续更新中,期待您的关注!🎉🎉🎉
33 1
vue学习第十章(组件开发)
|
13天前
|
前端开发 JavaScript 测试技术
Vue3中v-model在处理自定义组件双向数据绑定时,如何避免循环引用?
Web 组件化是一种有效的开发方法,可以提高项目的质量、效率和可维护性。在实际项目中,要结合项目的具体情况,合理应用 Web 组件化的理念和技术,实现项目的成功实施和交付。通过不断地探索和实践,将 Web 组件化的优势充分发挥出来,为前端开发领域的发展做出贡献。
24 8
|
13天前
|
JavaScript
在 Vue 3 中,如何使用 v-model 来处理自定义组件的双向数据绑定?
需要注意的是,在实际开发中,根据具体的业务需求和组件设计,可能需要对上述步骤进行适当的调整和优化,以确保双向数据绑定的正确性和稳定性。同时,深入理解 Vue 3 的响应式机制和组件通信原理,将有助于更好地运用 `v-model` 实现自定义组件的双向数据绑定。
|
25天前
|
JavaScript 前端开发 UED
vue学习第二章
欢迎来到我的博客!我是一名自学了2年半前端的大一学生,熟悉JavaScript与Vue,目前正在向全栈方向发展。如果你从我的博客中有所收获,欢迎关注我,我将持续更新更多优质文章。你的支持是我最大的动力!🎉🎉🎉
38 3
|
JavaScript
Vue的非父子组件之间传值
全局事件总线 一种组件间通信的方式,适用于任意组件间通信
|
缓存 JavaScript 前端开发
Vue Props、Slot、v-once、非父子组件间的传值....
Vue Props、Slot、v-once、非父子组件间的传值....
86 0
|
JavaScript
Vue中父子组件传值
先在⽗组件中给⼦组件的⾃定义属性绑定⼀个⽗组件的变量
|
JavaScript
vue 组件传值
vue 组件传值
84 0