Vue3 mitt 史上最全使用指南,没有之一

一、安装 mitt

sql 复制代码
bashCopy Code
npm install mitt  # ‌:ml-citation{ref="1,2" data="citationList"}
pnpm install mitt # ‌:ml-citation{ref="2" data="citationList"}
yarn add mitt     # ‌:ml-citation{ref="3" data="citationList"}

二、基本使用方式

  1. 局部使用(单文件内)

    • 创建事件总线实例:

      ruby 复制代码
      javascriptCopy Code
      import mitt from 'mitt';
      const emitter = mitt();  // ‌:ml-citation{ref="2,3" data="citationList"}
    • 触发事件

      ruby 复制代码
      javascriptCopy Code
      emitter.emit('eventName', data);  // ‌:ml-citation{ref="1,2" data="citationList"}
    • 监听事件

      ruby 复制代码
      javascriptCopy Code
      emitter.on('eventName', (data) => {
        console.log('接收数据:', data);
      });  // ‌:ml-citation{ref="1,2" data="citationList"}
  2. 全局使用(跨组件通信)

    • main.ts 中注册全局事件总线:

      ini 复制代码
      typescriptCopy Code
      import { createApp } from 'vue';
      import mitt from 'mitt';
      const app = createApp(App);
      app.config.globalProperties.emitter = mitt();  // ‌:ml-citation{ref="6,7" data="citationList"}
      app.mount('#app');
    • 在组件中通过全局属性调用:

      ruby 复制代码
      typescriptCopy Code
      import { getCurrentInstance } from 'vue';
      const { emitter } = getCurrentInstance()!.appContext.config.globalProperties;  // ‌:ml-citation{ref="2,7" data="citationList"}

三、事件监听与移除

操作 代码示例 作用说明
移除单个事件监听 emitter.off('eventName') 解绑指定事件‌
清空所有事件监听 emitter.all.clear() 移除所有监听‌
批量监听/移除 结合 emitter.onemitter.off 实现 动态管理事件‌

四、使用场景示例

  1. 组件间数据传递

    • 子组件触发事件:

      css 复制代码
      vueCopy Code
      <button @click="emitter.emit('send-data', { id: 1 })">发送数据</button>  // ‌:ml-citation{ref="5,8" data="citationList"}
    • 父组件监听事件:

      ruby 复制代码
      javascriptCopy Code
      emitter.on('send-data', (data) => {
        console.log('接收子组件数据:', data);
      });  // ‌:ml-citation{ref="5,8" data="citationList"}
  2. 跨层级组件通信

    • 非父子组件通过全局 emitter 实现交互,无需逐层传递 props‌。

五、注意事项

  1. 避免内存泄漏

    • 组件销毁时需手动移除事件监听(如在 onUnmounted 生命周期中调用 emitter.off)‌。
  2. 事件命名规范

    • 使用唯一且明确的事件名称,防止命名冲突‌。
  3. TypeScript 支持

    • 全局使用时需扩展 ComponentCustomProperties 类型声明‌。

完整代码示例

typescript 复制代码
typescriptCopy Code
// 全局注册(main.ts)
import { createApp } from 'vue';
import mitt from 'mitt';
declare module '@vue/runtime-core' {
  interface ComponentCustomProperties {
    emitter: ReturnType<typeof mitt>;
  }
}
const app = createApp(App);
app.config.globalProperties.emitter = mitt();  // ‌:ml-citation{ref="7" data="citationList"}
app.mount('#app');

// 组件中使用
import { getCurrentInstance } from 'vue';
const { emitter } = getCurrentInstance()!.appContext.config.globalProperties;

// 触发事件
emitter.emit('update-list', { items: [1, 2, 3] });  // ‌:ml-citation{ref="1,2" data="citationList"}

// 监听事件
emitter.on('update-list', (data) => {
  console.log('列表更新:', data);
});  // ‌:ml-citation{ref="2,3" data="citationList"}

// 销毁时移除监听
onUnmounted(() => {
  emitter.off('update-list');  // ‌:ml-citation{ref="2,3" data="citationList"}
});
相关推荐
一点一木21 小时前
深度体验TRAE SOLO移动端7天:作为独立开发者,我把工作流揣进了兜里
前端·人工智能·trae
天外飞雨道沧桑1 天前
TypeScript 中 omit 和 record 用法
前端·javascript·typescript
Lee川1 天前
mini-cursor 揭秘:从 Tool 定义到 Agent 循环的完整实现
前端·人工智能·后端
canonical_entropy1 天前
从 Spec-Driven Development 到 Attractor-Guided Engineering
前端·aigc·ai编程
研☆香1 天前
聊聊前端页面的三种长度单位
前端
给钱,谢谢!1 天前
React + PixiJS 实现果园成长页:从状态机到浇水动画
前端·react.js·前端框架
暗冰ཏོ1 天前
VUE面试题大全
前端·javascript·vue.js·面试
次元工程师!1 天前
LangFlow开发(三)—Bundles组件架构设计(3W+字详细讲解)
java·前端·python·低代码·langflow
Bug-制造者1 天前
现代Web应用全栈开发:从架构设计到部署落地实战
前端
青春喂了后端1 天前
IntelliGit 前端状态层重构:把一个全局 Store 拆成清晰的状态边界
前端·重构·状态模式