vue eventBus实现组件通信

阅读数:74 评论数:0

跳转到新版页面

分类

html/css/js

正文

一、vue2

eventBus 又称为事件总线,在vue中可以使用它来作为沟通桥梁的概念, 就像是所有组件共用相同的事件中心,可以向该中心注册发送事件或接收事件, 所以组件都可以通知其他组件。

eventBus也有不方便之处, 当项目较大,就容易造成难以维护的灾难

1、初始化

// event-bus.js

import Vue from 'vue'
export const EventBus = new Vue()

2、发送事件

<template>
  <div>
    <show-num-com></show-num-com>
    <addition-num-com></addition-num-com>
  </div>
</template>

<script>
import showNumCom from './showNum.vue'
import additionNumCom from './additionNum.vue'
export default {
  components: { showNumCom, additionNumCom }
}
</script>



// addtionNum.vue 中发送事件

<template>
  <div>
    <button @click="additionHandle">+加法器</button>    
  </div>
</template>

<script>
import {EventBus} from './event-bus.js'
console.log(EventBus)
export default {
  data(){
    return{
      num:1
    }
  },

  methods:{
    additionHandle(){
      EventBus.$emit('addition', {
        num:this.num++
      })
    }
  }
}
</script>

3、接收事件

// showNum.vue 中接收事件

<template>
  <div>计算和: {{count}}</div>
</template>

<script>
import { EventBus } from './event-bus.js'
export default {
  data() {
    return {
      count: 0
    }
  },

  mounted() {
    EventBus.$on('addition', param => {
      this.count = this.count + param.num;
    })
  }
}
</script>

4、移除事件监听者

import { eventBus } from 'event-bus.js'
EventBus.$off('addition', {})

二、vue3

vue3.x移除了$on、$off和$once这几个事件 API,但可以使用第三方插件 实现EventBus,这里使用mitt。

1、安装依赖

npm install --save mitt

2、全局声明 main.js

import { createApp } from 'vue'
import mitt from 'mitt'
import App from './App.vue'

const app = createApp(App)
app.config.globalProperties.Bus = mitt()
app.mount('#app')

3、生成event

<template>
  <button @click="onclick">按钮</button>
</template>

<script setup>
import { getCurrentInstance, onBeforeMount } from 'vue'
// 获取到 全局事件总线
const { Bus }  = getCurrentInstance().appContext.config.globalProperties

const onclick = () => {
  Bus.emit('Event', { a: 'b' })
}
</script>

4、添加监听

Bus.on('Event', (res)=>{
  // res 就是emit传过来的数据
  console.log(res)
})

5、移除监听

Bus.off('Event');

// 清空所有
Bus.all.clear();



相关推荐

一、父组件向子组件传值 父组件通过props的方式向子组件传递数据,props只可以从上一级组件传递到下一级组件,而且props只读。 1、基本示例 (1)创建子组件,在src/components/

一、生命周期 1、vue2生命周期 beforeCreate #实例初始化之后,进行数据侦听和事件/侦听器的配置之前同步调用 created #实例创建完成后被立即同步调用 beforeMount #

一、使用pnpm新建项目 可以使用npm 或yarn或pnpm来初始化Vite项目 pnpm create vite xxx(项目名称) #选择vue #选择js cd xxx (进入项目目录) #安

一、概述 <script setup> 是在单文件组件(SFC)中使用组合式API的编译时语法糖,解决Vue3.0中setup需要频繁将声明的变量、函数以及import引入的内容通过return向外

一、概述 在vue2中,data函数里返回的值直接为响应式,但在vue3中我们需要使用一些函数才能达到这个效果。 setup函数中拿不到vue的this。 二、常用函数 <template> <d

<script> export default { setup() { const func1= () => { console.log("func1");

缓存页面主要Jul为了防止重复渲染dom,减少加载时间及性能消耗,提高用户体验。 一、旧版的语法 <keep-alive> <router-view v-if="$route.meta.kee

一、在main.js挂载 import { createApp } from 'vue' import App from './App.vue' import router from './route

一、概述 在vue3中没有$refs这个对象,可以使用如下方法 <template> <div><input type="text" ref="txt1" value="hello" /></div>

方式一、全局引入 全局引入element之后事,element已经在app.config.globalProperties添加了全局方法$message,所以可以在组件中直接使用。 方式二、按需引入