前端/移动开发面试题更新 2026-08-05

在 Vue 项目中,如果把 EventBus 注册为 Vue 实例的全局对象,在路由切换过程中为什么会出现事件重复触发的问题?该如何定位并解决这个高频问题?

前端/移动开发技术原理问题排查Vue

考察说明

考查对 EventBus 事件生命周期与组件销毁时机的理解,以及全局事件管理的实践能力。

回答思路

  1. 【回答框架 1】路由切换时组件实例被销毁,但通过 $on 监听的事件并不会自动移除,因为监听器挂载在全局 bus 上,不随组件销毁而释放。多次进入同一页面,每次 created 都会新增监听,导致重复触发。
  2. 【回答框架 2】核心解决思路是在组件销毁前解绑:在 beforeDestroy 或 onBeforeUnmount 中调用 $off 移除对应事件。若不传事件名会移除所有监听,可能影响其他组件,应尽量指定事件名与回调函数,或使用 $once 处理一次性事件。
  3. 【回答框架 3】更推荐使用事件名常量管理,避免字符串拼写错误;在 created 中绑定事件后,务必在 destroyed 中成对解绑。如果使用 Vue 3,还可以用 mitt 等库,并在 onUnmounted 中 off。
  4. 【回答框架 4】另一种方案是改用 provide/inject 或 vuex,将数据流改为响应式共享,减少对全局事件的依赖,从根上避免此类问题。
  5. 【关键点 1】$on 事件不随组件销毁自动解绑,是重复触发的直接原因。
  6. 【关键点 2】在 beforeDestroy/onBeforeUnmount 中调用 $off 并指定事件名与回调,是标准解法。
  7. 【关键点 3】使用 $once 或事件名常量能减少重复注册与误解绑的风险。
  8. 【易错点 1】不要仅用 $off 不传参数,会移除所有 $on 监听,可能影响其他组件。
  9. 【易错点 2】不要在路由切换后通过强制刷新页面来解决,这会造成性能开销和体验问题。
  10. 【易错点 3】不要忘记在组件销毁时解绑,否则内存泄漏和重复触发会持续存在。