Vue3 进阶-Mitt 库实现全局事件总线

大家好呀~今天给大家带来一个超级实用的Vue3技巧:如何用mitt库实现全局事件总线!如果你在项目中需要跨组件通信,但又不想用Vuex或Pinia这种重量级的状态管理工具,那么mitt绝对是你的最佳选择!话不多说,直接开整~


🌟 什么是mitt?

mitt是一个极简的事件总线库,只有20行代码,体积非常小(1kb左右),非常适合用于轻量级的事件监听和分发场景。它的核心功能就是通过订阅-发布模式来实现组件间的通信。

官方文档https://github.com/developit/mitt


✨ mitt的核心方法

mitt提供了三个核心方法:

  1. emit(event, data):触发事件并传递数据。
  2. on(event, handler):监听某个事件,并执行回调函数。
  3. off(event, handler):移除某个事件的监听器。

是不是很简单?接下来我们通过一个实际案例来学习如何使用它吧!


🔥 实战案例:父子组件与兄弟组件通信

假设我们有一个简单的场景:父组件中有一个按钮,点击后需要通知子组件更新状态;同时还有一个兄弟组件,也需要接收到这个消息并做出响应。


1️⃣ 安装mitt

首先,我们需要安装mitt库:

npm install mitt

2️⃣ 创建全局事件总线

src目录下创建一个文件eventBus.js,用来初始化mitt实例:

// src/eventBus.js
import mitt from 'mitt';

// 创建事件总线实例
const emitter = mitt();

export default emitter;

3️⃣ 父组件:触发事件

在父组件中,我们通过emit方法触发事件,并传递数据给其他组件。

<!-- ParentComponent.vue -->
<template>
  <div>
    <h1>我是父组件</h1>
    <button @click="sendMessage">发送消息给子组件和兄弟组件</button>
  </div>
</template>

<script>
import emitter from '@/eventBus';

export default {
  name: 'ParentComponent',
  methods: {
    sendMessage() {
      // 发送事件,携带数据
      emitter.emit('message', { text: 'Hello from Parent!' });
    }
  }
};
</script>

4️⃣ 子组件:监听事件

在子组件中,我们通过on方法监听事件,并在接收到数据时执行相应操作。

<!-- ChildComponent.vue -->
<template>
  <div>
    <h2>我是子组件</h2>
    <p>{{ message }}</p>
  </div>
</template>

<script>
import emitter from '@/eventBus';

export default {
  name: 'ChildComponent',
  data() {
    return {
      message: ''
    };
  },
  created() {
    // 监听事件
    emitter.on('message', this.handleMessage);
  },
  beforeUnmount() {
    // 移除监听器,防止内存泄漏
    emitter.off('message', this.handleMessage);
  },
  methods: {
    handleMessage(data) {
      this.message = data.text;
    }
  }
};
</script>

5️⃣ 兄弟组件:监听事件

兄弟组件也可以通过同样的方式监听事件并接收数据。

<!-- SiblingComponent.vue -->
<template>
  <div>
    <h2>我是兄弟组件</h2>
    <p>{{ message }}</p>
  </div>
</template>

<script>
import emitter from '@/eventBus';

export default {
  name: 'SiblingComponent',
  data() {
    return {
      message: ''
    };
  },
  created() {
    // 监听事件
    emitter.on('message', this.handleMessage);
  },
  beforeUnmount() {
    // 移除监听器,防止内存泄漏
    emitter.off('message', this.handleMessage);
  },
  methods: {
    handleMessage(data) {
      this.message = `兄弟组件收到了:${data.text}`;
    }
  }
};
</script>

6️⃣ App.vue:组装组件

最后,在App.vue中将这三个组件组合起来:

<!-- App.vue -->
<template>
  <div id="app">
    <ParentComponent />
    <ChildComponent />
    <SiblingComponent />
  </div>
</template>

<script>
import ParentComponent from './components/ParentComponent.vue';
import ChildComponent from './components/ChildComponent.vue';
import SiblingComponent from './components/SiblingComponent.vue';

export default {
  name: 'App',
  components: {
    ParentComponent,
    ChildComponent,
    SiblingComponent
  }
};
</script>

💡 运行效果

  1. 当你点击父组件中的按钮时,会触发message事件。
  2. 子组件和兄弟组件都会接收到这个事件,并更新各自的message内容。

⚠️ 注意事项

  1. 避免内存泄漏:记得在组件销毁时调用off方法移除监听器,否则会导致内存泄漏。
  2. 单一职责:虽然mitt可以实现全局事件总线,但不要滥用,尽量保持组件之间的解耦。

🎉 总结

通过mitt,我们可以轻松实现Vue3项目中的跨组件通信,尤其适合一些简单的场景。相比Vuex或Pinia,mitt更加轻量化,同时也更容易上手。

希望这篇教程能帮到大家! 😘

🌟 结语

今天的分享就到这里啦!希望这篇笔记能帮助大家更好地理解和应用 Mitt。如果你觉得有用,别忘了点赞、收藏和关注我哦!如果有任何问题或想法,欢迎在评论区留言交流,我们一起学习进步!🌟

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值