关于定时器setInterval,渲染页面问题

1,338 阅读2分钟

前两天遇到一个bug找半天才发现是vue的问题:有一个需求是在页面上没隔两秒就要轮询一个后台接口,不管你有没有离开这个页面,只要你触发了这个定时器,它就不能关掉,只能等它自己执行完。

问题一

由于定时器不能清空,所以当你在在这个页面执行完定时器之后,去别的页面,然后再回到这个页面,又会触发一个新的定时器

问题二

刚开始我是通过在localstroage里存一个flag判断这个定时器有没有执行,如果执行就不生成新的定时器,如果没有就生成新的定时器,所以问题就来了,当你刷新页面的时候,浏览器会把你刚才的定时器清空,却不会吧localstroage里的数据清空

进阶版

我一想,这是不是可以用vueX来做,给这个flag设置一个初值,当他刷新页面的时候,就会变回初值,就可以执行这个定时器了,美滋滋,结果发现定时器确实是好的,但是页面上的数据却没有渲染,定时器的接口返回了新的数据,页面上却还是旧的数据。

大约一个半小时后

我突然想起来了,因为页面每次进来都会初始化一遍数据,你定时器里的数据已经不是你现在页面上的数据了,定时器里的this指向你上一个页面的this,定时器接口返回的数据也是你上一个页面的数据,你在这个页面当然是拿不到的,所以页面的数据就不会刷新。

终于找到问题关键

这样的话大概就知道怎么解决了,利用keep-alive页面缓存就可以解决这个渲染问题了,如果你别的页面不需要用到缓存,你可以用include进行动态缓存就好啦

最后

这篇文章真的写的很好,juejin.cn/post/684490…看完对你理解这些很有帮助