Vue 子组件destroyed,但是子组件实例没有销毁(一个很有深度的问题)

问题:在Vue中子组件执行destroyed钩子函数但是实例却没有销毁
分享已经知道的内容:
1、vue项目假设只有一级路由(vue-router),那么在一级路由中切换子组件(具体vue文件),会执行vue文件中的destroyed,这时候我认为这个子组件销毁了
2、vue文件中this表示的就是这个子组件的对象,在每次一级路由中切换这个子组件,那么会不断的创建新的this对象,销毁这个this对象

实验情景: 一个简单的登录和主页的vue单页面系统,登录页面和主页在一级路由中切换,我在主页的created钩子函数中写下如下代码:

clipboard.png

定时器每隔一段时间就轮询获取this对象,当我来回切换登录和主页的时候,会发现,这个定时器打印出多个this对象,呵呵,奇怪吧? 明明切换的时候销毁了,但是销毁的这个this对象为什么会存在? 这样有什么问题? 也就是说在定时器中输出data属性, 这个属性初始化的时候是动态生成的随机数,会发现,同一个this的属性由多个内容。。。。

解决办法也有,在切换回登录的时候调用location.load去刷新,清空。。。。 但是我真不知道原理是什么,导致出现莫名其妙的异常。。。让我毁了三观,日了狗

阅读 17.7k
4 个回答

接楼上的解答补充来说,要销毁的是定时器

...
mounted() {
    this.timer = setInterval(() => {
        console.log(this);
    }, 30000);
},

destoryed() {
    clearInterval(this.timer);
}

你这个问题是,定时器是挂载到window上的,定时器的参数是一个函数,这个函数是一个闭包,这个闭包里面访问了这个实例对象this,于是 window引用定时器,定时器引用函数,函数引用this,定时器不卸载,this就能被window对象遍历到,就不会被回收;这个是定时器引起的内存泄漏;

你这个叫 内存泄漏。

你在定时器里面引用它,它永远也不会销毁,你进多少次,当然给你创建多少个

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题