news 2026/7/29 20:51:05

Vue 3 中移除了 $on、$off 和 $once 方法

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Vue 3 中移除了 $on、$off 和 $once 方法

Vue3移除了$on、$off和$once事件API,旨在简化API并更好地支持组合式API。


主要替代方案包括:

1)使用mitt等第三方事件库;

2)基于provide/inject和响应式状态模拟事件总线;

3)使用composable共享状态;

4)采用Pinia/Vuex进行状态管理;

5)父子组件通过props/emits通信。


Vue3鼓励使用更明确的组件通信方式,如状态管理工具和组合式API,替代传统事件总线模式,使代码更可维护。


推荐优先考虑Pinia配合provide/inject或composables方案。


Vue 3 中移除了$on$off$once方法


这是 Vue 3 的一项重大变化。


为什么被移除?

Vue 3 的事件 API 重构旨在:

  1. 简化 API- 减少全局方法数量

  2. 更好地支持组合式 API- 传统的事件总线模式与组合式 API 理念不太契合

  3. 促进更明确的组件通信模式- 鼓励使用更可维护的通信方式


替代方案

1.使用第三方事件库(最接近的替代)

// 安装:npm install mitt import mitt from 'mitt'; // 创建事件总线 const emitter = mitt(); // 发送事件 emitter.emit('event-name', data); // 监听事件 emitter.on('event-name', (data) => { console.log(data); }); // 取消监听 emitter.off('event-name', handler);

2.使用 Vue 3 的 provide/inject + 响应式状态

// 事件总线模拟 import { reactive, provide, inject } from 'vue'; // 创建事件总线 const eventBusSymbol = Symbol(); export function createEventBus() { const listeners = reactive({}); return { on(event, callback) { if (!listeners[event]) listeners[event] = []; listeners[event].push(callback); }, off(event, callback) { if (listeners[event]) { const index = listeners[event].indexOf(callback); if (index > -1) listeners[event].splice(index, 1); } }, emit(event, data) { if (listeners[event]) { listeners[event].forEach(callback => callback(data)); } } }; } // 使用 export function useEventBus() { return inject(eventBusSymbol); }

3.使用 composable 替代事件总线

// counter.js - 共享状态 import { ref, readonly } from 'vue'; export function useCounter() { const count = ref(0); const increment = () => { count.value++; // 可以在这里触发其他逻辑 }; return { count: readonly(count), increment }; } // 多个组件共享同一个实例

4.使用 Vuex/Pinia 进行状态管理

// 使用 Pinia(Vue 3 推荐状态管理) import { defineStore } from 'pinia'; export const useAppStore = defineStore('app', { state: () => ({ events: [], data: null }), actions: { triggerEvent(eventName, payload) { // 处理事件逻辑 } } });

5.使用 v-model 和 emits(父子组件通信)

<!-- 子组件 --> <script setup> defineProps(['modelValue']); defineEmits(['update:modelValue']); const updateValue = (newVal) => { emit('update:modelValue', newVal); }; </script> <!-- 父组件 --> <ChildComponent v-model="value" />

迁移建议

  1. 父子组件通信→ 使用propsemits

  2. 兄弟组件通信→ 使用共同的父组件或状态管理

  3. 远房组件通信→ 使用 Pinia/Vuex 或 provide/inject

  4. 全局事件→ 使用mitt等第三方库


总结

虽然$on被移除,但 Vue 3 提供了更现代化、类型安全的替代方案。


对于大多数应用,推荐使用Pinia进行状态管理,配合provide/injectcomposables来替代传统的事件总线模式。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/24 5:52:06

2024年3月GESP真题及题解(C++八级): 接竹竿

2024年3月GESP真题及题解(C八级): 接竹竿 题目描述 小杨同学想用卡牌玩一种叫做“接竹竿”的游戏。 游戏规则是&#xff1a;每张牌上有一个点数 v v v&#xff0c;将给定的牌依次放入一列牌的末端。若放入之前这列牌中已有与这张牌点数相 同的牌&#xff0c;则小杨同学会将这…

作者头像 李华
网站建设 2026/7/24 7:40:36

SSCMS 正式推出全新平台——献丑AI视频开源社区

作为国内领先的开源CMS厂商&#xff0c;SSCMS深耕内容管理领域多年。如今&#xff0c;我们从图文迈向视频&#xff0c;从内容管理延伸到内容创作&#xff0c;正式推出首个AI视频开源社区。在这里&#xff0c;你不仅能看到惊艳的AI视频作品&#xff0c;更能打开每一个作品的完整…

作者头像 李华
网站建设 2026/7/24 10:14:22

Agentic AI提示系统的分布式锁设计:架构师教你解决扩展时的数据一致性问题

Agentic AI提示系统的分布式锁设计:架构师教你解决扩展时的数据一致性问题 一、引入:当Agent开始“抢菜单”——一个真实的崩溃现场 凌晨3点,某电商平台的客服运营群突然炸了: “今天的自动回复全乱了!用户问‘退款流程’,Agent居然回复‘亲,记得给好评哦~’” “我明…

作者头像 李华
网站建设 2026/7/26 3:11:20

吐血推荐专科生必用AI论文软件TOP10

吐血推荐专科生必用AI论文软件TOP10 专科生论文写作的“隐形助手”测评 随着AI技术的不断进步&#xff0c;越来越多的专科生开始借助AI论文软件提升写作效率与质量。然而&#xff0c;面对市场上种类繁多的工具&#xff0c;如何选择一款真正适合自己的成了难题。为此&#xff0c…

作者头像 李华
网站建设 2026/7/28 16:45:32

springboot_ssm835面向学生成绩分析系统--论文

目录 具体实现截图摘要 系统所用技术介绍写作提纲源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01; 具体实现截图 摘要 随着教育信息化的快速发展&#xff0c;学生成绩分析在教育教学管理中扮演着重要角色。传统成绩分析方式依赖人工统…

作者头像 李华
网站建设 2026/7/26 1:54:16

2026年,测试报告将由AI自动生成,你只需做决策

1.1 智能生成引擎的底层逻辑 动态日志分析&#xff1a;基于Transformer的日志语义理解模型&#xff08;如LogBERT&#xff09;实时解析测试过程数据 缺陷预测矩阵&#xff1a;集成历史缺陷库与代码变更特征训练的风险概率模型&#xff08;示例见下表&#xff09; 多模态呈现&…

作者头像 李华