vue-router中使用EventBus传值需要注意到的问题

在Vue项目中,为避免状态管理的复杂性,有时会使用EventBus传递数据。本文介绍了在vue-router切换时,如何正确使用EventBus,特别是在组件生命周期中的注意事项。当路由切换时,新组件先加载,旧组件后销毁,可能导致$on监听事件未及时注册。解决方案是在旧组件的beforeDestroy或destroyed中使用$emit,或者利用vm.nextTick确保在DOM更新后异步执行$emit,从而正确传递状态。同时,若不使用keep-alive,需注意在beforeDestroy中手动调用$off防止监听器堆积。
摘要由CSDN通过智能技术生成

最近负责开发一个视频相关的项目,要用到vue-router,同时涉及到一些共有状态管理,但是少量的状态又不想用vuex,于是用到了EventBus,一般来说, 我们用EventBus的步骤如下:
- 首先新建一个js用来创建我们的EventBus,如Bus.js

import Vue from 'vue';  
...
export default new Vue();  
  • 接着,我们在需要的地方通过$emit触发自定义事件,比如我这个时候有一个视频当前播放时间的状态需要传递
import Bus from '../components/Bus.js'
...
Bus.$emit('currentTime', 'time')
  • 再然后就是我们在另一个路由页面(就分别叫页面A和B吧)通过$on监听自定义事件
import Bus from '../components/Bus.js'
...
Bus.$on('currentTime', (time) => console.log(time))

通常情况下这个是应该可以打印出我们想要的数据,但是经我实验发现,当第一次通过路由跳转页面的时候控制台是没有任何输出的,只有第二次跳转开始控制台才有输出,然后我就去查了下资料,发现有这么一种说法:

vue-router切换的时候,会先加载新的组件,当新的组件渲染好但是还没mount的时候,销毁旧组件,然后再挂载新组件,也就是说当B页面的生命周期进行到beforeMount的时候,下一步走到的就是A页面的beforeDestory方法和接下去的destroyed方法

要知道我们一般都是在B页面的created方法里面去使用 oncreate o n 监 听 自 定 义 事 件 , 但 是 通 过 上 面

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值