最近负责开发一个视频相关的项目,要用到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方法里面去使用 on监听自定义事件,但是通过上面那段话我们知道,当我们在create方法里面监听事件的时候 o n 监 听 自 定 义 事 件 , 但 是 通 过 上 面