vue項目中實現定時刷新頁面(重新渲染數據實時更新)


需求: 每隔一分鍾自動刷新一下當前頁面,同時發送請求,重新渲染數據,以到達實時更新。

開始:

js有兩種定時器

setInterval(function(){}, milliseconds)——會不停的調用函數

setTimeout(function(){}, milliseconds)——只執行函數一次

乍看之下,setInterval會符合我們的業務需求,然而也需要注意一些坑,單純的使用setInterval會導致頁面卡死!其原因與JS引擎線程有關, 用通俗話說就是setInterval不會清除定時器隊列,每重復執行1次都會導致定時器疊加,最終卡死你的網頁。

但是setTimeout是自帶清除定時器的,因此正確解決方法如下:

data(){
  return {
       timer:null, //定時器名稱
    }
},
mounted(){
   this.queryInfo();
   this.timer = setInterval(() => {
       setTimeout(this.queryInfo, 0)
   }, 1000*60)
},
methods: {
   queryInfo(){
    //do something
   },
},
beforeDestroy(){
   clearInterval(this.timer);        
   this.timer = null;
}

說明: 1.在執行定時器前先執行一次獲取接口數據的操作函數, 否則接口會1分鍾后才調用

         2.為了避免退出當前頁面后,在其他頁面也繼續調用接口,退出前需要清除定時器.

 

清除定時器優化方案

上面的清除定時器方案有兩點不好:

  • 它需要在這個組件實例中保存這個 timer,如果可以的話最好只有生命周期鈎子可以訪問到它。這並不算嚴重的問題,但是它可以被視為雜物。
  • 我們的建立代碼獨立於我們的清理代碼,這使得我們比較難於程序化的清理我們建立的所有東西

優化方案:

通過$once這個事件偵聽器器在定義完定時器之后的位置來清除定時器.

const timer = setInterval(() =>{                    
    // 某些定時器操作                
}, 500);            
// 通過$once來監聽定時器,在beforeDestroy鈎子可以被清除。
this.$once('hook:beforeDestroy', () => {            
    clearInterval(timer);                                    
})

本文感謝【大魚吃小魚7】的文章https://blog.csdn.net/qq_37210523/article/details/103121237


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM