最近在做一个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)//销毁订阅
}
至此问题解决