一些特殊的场景(如没有父子关系),那么Vue自带的通信事件解决不了。需要用到事件总线:、
- 全局挂载
Vue.prototype.$bus =new Vue() - 发送事件
this.$bus.$emit('getItem',this.playListItem) //页面A - 监听事件
this.$bus.$on('getItem',(item)=>console.log(item))//在页面B created中执行
今天碰到的问题
1.没有监听到事件
第一次A页面发送getItem事件的时候,页面B中的$on事件没有被触发,返回A页面再发送一次才被B页面on监听到A发送的事件getItem
* 翻了资料找到了原因:当我们还在页面A的时候,页面B还没生成,也就是页面B中的 created中所监听的来自于A中的事件还没有被触发。这个时候当页面A中发送事件的时候,B其实是没有监听到的。
* 解决办法:把A页面组件中的emit事件写在`beforeDestory`中去。因为这个时候,B页面组件已经被created了,也就是我们写的on事件已经触发了,所以可以在`beforeDestroy`的时候, on事件已经触发了,所以可以在`beforeDestory`的时候,on事件已经触发了,所以可以在`beforeDestory`的时候emit事件
* 
2.事件会叠加发送
后面再一次依次去触发的时候会出现,每一次都会发现好像之前的on事件分发都没有被撤销一样,导致每一次的事件触发执行越来越多。 如下
* 
* #### 产生原因:
就是说,这个$on事件是不会自动清楚销毁的,需要我们手动来销毁。
* 解决:在B组件页面中添加`Bus.$off`来关闭

3.使用keep-alive 碰到的问题
又发现一个问题:keep-alive缓存的页面只会执行一次created和mounted并且页面被缓存下来,没有destroyed和created了
但是又多了俩个生命周期函数activated、deactivated。如如果使用了keep-alive:就要在A页面的deactivated 发送$bus事件了,
同样的要在B页面的deactivated注销事件
概括
一、组件A emit 事件应在beforeDestory生命周期内。
二、组件B内的 on 记得要销毁
三、使用了keep-alive要在activated、deactivated 发送和注销事件