knowLedge-无关系组件间方法的调用(创建新的 Vue 实例来作为事件总线(Event Bus)方法实现)

1.前言

在vue中两个组件无关系(非父子,兄弟即非直接关系),要实现一个组件对另一个组件方法调用以及数据通信。vue本身没有直接提供非关系组件间通信的内置机制 。

使用全局事件总线可以用于不同组件间监听与触发事件。注意事件监听器的清理避免内存泄露。

2.实践

2.1创建event-bus.js

首先,创建一个单独的 Vue 实例文件(比如 event-bus.js),这个文件将作为事件总线:

javascript 复制代码
// event-bus.js  
import Vue from 'vue';  
export const EventBus = new Vue();

在需要触发和监听的事件对应的组件中引入,根据需求进行调整修改。

2.2 组件A触发事件

使用 $emit 来触发事件。

javascript 复制代码
<!-- ComponentA.vue -->  
<template>  
  <button @click="triggerEvent">Trigger Event in Component B</button>  
</template>  
  
<script>  
import { EventBus } from './event-bus.js';  
  
export default {  
  methods: {  
    triggerEvent() {  
      // 使用事件总线触发事件  
      EventBus.$emit('custom-event', { message: 'Hello from Component A' });  
    }  
  }  
}  
</script>
2.3组件B监听事件

使用 $on 来监听事件。

javascript 复制代码
<!-- ComponentB.vue -->  
<template>  
  <div>  
    <p>Message from Component A: {{ message }}</p>  
  </div>  
</template>  
  
<script>  
import { EventBus } from './event-bus.js';  
  
export default {  
  data() {  
    return {  
      message: ''  
    };  
  },  
  created() {  
    // 组件创建时监听事件  
    EventBus.$on('custom-event', (data) => {  
      this.message = data.message;  
    });  
  },  
  beforeDestroy() {  
    // 组件销毁前移除监听器,防止内存泄漏  
    EventBus.$off('custom-event');  
  }  
}  
</script>

3.总结

ComponentA 使用 EventBus.$emit 来触发一个名为 custom-event 的事件,并传递了一个包含消息的对象作为参数。ComponentB 则在 created 钩子中使用 EventBus.$on 来监听这个事件,并在事件触发时更新其 message 数据属性。

相关推荐
中微子6 分钟前
JavaScript 防抖与节流:从原理到实践的完整指南
前端·javascript
天天向上102421 分钟前
Vue 配置打包后可编辑的变量
前端·javascript·vue.js
芬兰y36 分钟前
VUE 带有搜索功能的穿梭框(简单demo)
前端·javascript·vue.js
好果不榨汁43 分钟前
qiankun 路由选择不同模式如何书写不同的配置
前端·vue.js
小蜜蜂dry43 分钟前
Fetch 笔记
前端·javascript
拾光拾趣录1 小时前
列表分页中的快速翻页竞态问题
前端·javascript
小old弟1 小时前
vue3,你看setup设计详解,也是个人才
前端
Lefan1 小时前
一文了解什么是Dart
前端·flutter·dart
Patrick_Wilson1 小时前
青苔漫染待客迟
前端·设计模式·架构
vvilkim1 小时前
Nuxt.js 全面测试指南:从单元测试到E2E测试
开发语言·javascript·ecmascript