vue销毁组件后pubsub的订阅事件bug

最近在做一个vue项目,页面中需要动态操作子组件,比如添加和删除组件等操作。每个组件之间的数据互相之间关联不大,所以也就不打算用vuex。但是后面突然多了个需求,需要把页面的数据包含各组件的数据存储到浏览器本地缓存,这就很尴尬了...
想不出什么好办法,只能引入pubsub,通过订阅发布来将子组件的数据汇集到父组件,再将数据进行缓存

思路是:
父组件触发publish发布save指令---->子组件触发subscribe订阅收到save指令---->子组件再触发publish提交数据--->父组件触发subscribe订阅得到所有子组件的数据

问题:
添加到页面的子组件的数据我需要,销毁了的子组件的数据我不需要,我本以为销毁了的组件不会触发订阅事件,果然还是太年轻了..

bug所在:
已经销毁的组件居然也触发了订阅事件,传回的数据变得一团糟

开始我以为是我销毁组件的方法错误,导致并没有真的销毁组件从而触发了订阅。通过测试生命周期destroyed,推翻这一想法

既然组件已经销毁,还继续触发订阅事件,我觉得合理的解释就是订阅事件的函数在内存中没有得到释放,那就要想办法手动给它销毁一下,看了一下pubsub的文档发现还有一个unsubscribe方法,尝试了一下,有点类似setInterval的问题,需要手动销毁

export default {
  data () {
    return {
      subscribe: null
    }
  },
  mounted () {
    this.subscribe = PubSub.subscribe('save',(msg,data)=>{//收到save指令
    PubSub.publish('submit',子组件数据) //子组件数据回传
  })//订阅
  },
  beforeDestroy () {
    PubSub.unsubscribe(this.subscribe)//销毁订阅
  }

至此问题解决

你可能感兴趣的:(vue销毁组件后pubsub的订阅事件bug)