高高兴兴下班后,没想到会被测试@。发现了一个定时器没有被清除,导致离开定时器所在路由后,定时器依然在工作。刚看到这个问题很是不解。
data() {
return {
timer:null
}
},
beforeDestroy(){
clearInterval(this.timer);
this.timer = null;
}
明明在销毁前,把定时器给清除了,为什么不行呢?去官网上看了,官网推荐用这种写法,
const timer = setInterval(()=>{)
this.$once('hook:beforeDestroy', function () {
clearInterval(timer);
})
但是这种写法并不是很适合我的项目,而且我的写法官网说也是可以的,只是会有两个潜在问题:
1.它需要在这个组件实例中保存这个 picker,如果可以的话最好只有生命周期钩子可以访问到它。这并不算严重的问题,但是它可以被视为杂物。
2.我们的建立代码独立于我们的清理代码,这使得我们比较难于程序化地清理我们建立的所有东西。
但这并不会造成定时器无法清除的问题。
最后通过自己的测试发现每次点击保存后,在离开路由。定时器就会在别的页面出现,仔细检查下发现,每次保存后都开了一个新的定时器。
if(this.timer!=null) {
this.clearTimer();
}
this.timer = setInterval(() => {
}, 5000);
最后每次开定时器前,检查下有米有旧的定时器,清除下ok了。