vue2与vue3的全局通信插件,如何实现自定义的插件

Vue 2 自定义插件(事件总线实现)

在 Vue 2 中,可以通过事件总线来实现全局通信。以下是创建一个简单事件总线插件的步骤:

  1. 创建插件文件 eventBus.js

    // eventBus.js
    import Vue from 'vue';

    const EventBus = new Vue();

    export default {
    install(Vue) {
    Vue.prototype.$bus = EventBus; // 将 EventBus 添加到 Vue 原型上
    },
    };

2.在主文件中引入插件并使用

复制代码
// main.js
import Vue from 'vue';
import App from './App.vue';
import EventBus from './eventBus';

Vue.use(EventBus);

new Vue({
  render: (h) => h(App),
}).$mount('#app');

3.在组件中使用

  • 触发事件

    this.bus.emit('my-event', { data: 'Hello, World!' });

监听事件

复制代码
this.$bus.$on('my-event', (payload) => {
  console.log(payload.data);
});

Vue 3 自定义插件(使用 provideinject 实现)

在 Vue 3 中推荐使用 provideinject API 来进行全局通信,可以实现更灵活的插件结构。

  1. 创建插件文件 eventBus.js

    // eventBus.js
    import { reactive } from 'vue';

    const EventBus = reactive({
    events: {},

    on(event, callback) {
    if (!this.events[event]) {
    this.events[event] = [];
    }
    this.events[event].push(callback);
    },

    off(event, callback) {
    if (!this.events[event]) return;
    this.events[event] = this.events[event].filter(cb => cb !== callback);
    },

    emit(event, payload) {
    if (!this.events[event]) return;
    this.events[event].forEach(callback => callback(payload));
    },
    });

    export default {
    install(app) {
    app.provide('eventBus', EventBus);
    },
    };

2.在主文件中引入插件并使用

复制代码
// main.js
import { createApp } from 'vue';
import App from './App.vue';
import EventBus from './eventBus';

const app = createApp(App);
app.use(EventBus);
app.mount('#app');

3.在组件中使用

  • 触发事件:

复制代码
  import { inject } from 'vue';

  setup() {
    const eventBus = inject('eventBus');
    
    function triggerEvent() {
      eventBus.emit('my-event', { data: 'Hello, World!' });
    }

    return { triggerEvent };
  }

监听事件:

复制代码
import { inject, onMounted, onUnmounted } from 'vue';

setup() {
  const eventBus = inject('eventBus');

  function handleEvent(payload) {
    console.log(payload.data);
  }

  onMounted(() => {
    eventBus.on('my-event', handleEvent);
  });

  onUnmounted(() => {
    eventBus.off('my-event', handleEvent);
  });
}
相关推荐
袅沫6 分钟前
Nginx中部署多个前端项目——区分路径
服务器·前端
meilindehuzi_a14 分钟前
Next.js 全栈基础实战:从 SPA、SSR 到 App Router 与 Todo API
开发语言·javascript·ecmascript
用户9210802628614 分钟前
6. 数据大屏 WebSocket 稳定性优化:心跳检测、断点续传和消息去重
前端
柚yuzumi14 分钟前
CSS 定位布局:让元素各就各位
前端·css
光影少年17 分钟前
react navite图片加载优化、大图卡顿、缓存策略
前端·react native·react.js
小林ixn17 分钟前
用 Next.js 和 Redis 撸一个 Markdown 笔记系统:RSC 实战与组件化拆解
前端·redis·next.js
渣波19 分钟前
重构旅行体验:基于 React 的 AI 旅游助手对话系统实战解析
前端·javascript
今日无bug21 分钟前
列表转树:一道题搞懂 HashMap 在算法里的价值
前端·数据结构
用户9210802628621 分钟前
5. 数据大屏实时通信第一步:为什么选择 WebSocket,以及如何接入 Socket.IO
前端
岁月留痕16822 分钟前
17 实战项目二:实现“日记”项目多页面管理
前端