亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

vue項目開發(fā)中setTimeout等定時器的管理問題

 更新時間:2018年09月13日 14:15:37   作者:hustxiaoxian  
這篇文章主要介紹了vue項目開發(fā)中setTimeout等定時器的管理問題,需要的朋友可以參考下

一、問題來源。

在項目中,我們經(jīng)常有這樣的需求,一個頁面初始化后,需要不斷的去請求后端,來獲取當前某個記錄的最新狀態(tài)。

顯然,這個可以用setTimeout以及回調(diào)中繼續(xù)setTimeout來實現(xiàn)。

我們假設(shè)定時器是在頁面#/test/aaa上創(chuàng)建的。

但是,會遇到以下兩個問題,我從#/test/aaa   這個頁面切換到  #/test/bbb頁面后如果停留在#/test/bbb,定時器還在跑。

其次,如果我不斷在#/test/aaa 和 #/test/bbb兩個頁面之間不斷的切換,而且切換時間小于定時器的間隔時間時,也會出現(xiàn)

重復(fù)創(chuàng)建setTimeout的情況。

現(xiàn)在的問題就是,我們?nèi)绾巫龅焦芾矶〞r器。

二、示例代碼。

created() {
  if ( this.timeOut ) {
    clearTimeout(this.timeOut);
  }
  this.getListIng();
},
computed: {
  timeOut: {
    set (val) {
      this.$store.state.timeout.compileTimeout = val;
    },
    get() {
      return this.$store.state.timeout.compileTimeout;
    }
  },
},
methods: {
  getListIng() {
    // 這里是一個http的異步請求
    if ( getUrlModule() == 'aaa' ) {
      let _this = this;
      this.timeOut = setTimeout(() => {
        _this.getListIng();
      }, 5000);
    } else {
      this.timeOut = '';
    }
  },
}

(1)如上面代碼所示,當創(chuàng)建頁面(created執(zhí)行)時,會先判斷變量this.timeOut是否存在,如果存在,先clearTimeout掉。

(2)而,this.timeOut這個變量對應(yīng)的是全局store里的this.$store.state.timeout.compileTimeout。并且是雙向綁定的,這個

請自行搜索vue2.0中computed用法。

 (3)在我們的主函數(shù)getListIng()中,會先使用函數(shù)getUrlModule()根據(jù)url判斷當前頁面是否是aaa頁面,如果是的,就執(zhí)行setTimeOut,

如果不是,就不行執(zhí)行了,并且設(shè)置this.timeOut = '';

我們假設(shè)上面沒有if ( getUrlModule() == 'aaa' ) 這句判斷,會出現(xiàn),當我們已經(jīng)跳出了當前aaa頁面,去了bbb頁面并且一直停留在bbb頁面時,

還有setTimeout在執(zhí)行,就會不斷有http的請求。

如果沒有if ( this.timeOut ) { clearTimeout(this.timeOut); } 這句代碼。當我們不斷在2個頁面之間切換時,且切換的頻率很高。會出現(xiàn)多次創(chuàng)建

setTimeout的情況。這個邏輯稍微有點繞,請閱讀者自行演算。

三、我們必須清楚的事實。

(1)vue中$store里創(chuàng)建的變量,其實是全局變量,這個變量在切換頁面時不會清除,當我們刷新頁面時會清除掉。

(2)在前端頁面中,當我們刷新頁面時,會將當前頁面之前創(chuàng)建的setTimeout以及其他定時器都清除掉。但是,切換頁面(僅僅是路由切換)

是不會清除的。

(3)setTimeout、setinterval有本質(zhì)的不同,前者只執(zhí)行一次,除非你在回調(diào)中,不斷的調(diào)用,而后者是不間斷調(diào)用的。但是,我在各種實踐中發(fā)現(xiàn),

還是setTimeout好用。因為,setTimeout可以根據(jù)條件,及時在回調(diào)中停用。如果采用setinterval,我們很有可能捕捉不到停用的條件而無法停用。

補充:Vue之SetTimeout

1.前言

相信很多人都遇到過這樣的問題,頁面數(shù)據(jù)需要不斷的刷新,也就是不斷的發(fā)送ajax請求來更新數(shù)據(jù),那么在vue中怎樣做才比較好呢?這里介紹一下我踩的坑,以及解決方案

2.問題

settimeout用來調(diào)用請求數(shù)據(jù),但是我遇到的問題就是,沒有用合適的方式去關(guān)閉settimeout,出現(xiàn)了離開當前頁面,請求還在不斷的發(fā)送問題,這樣給服務(wù)器帶來了無必要的壓力。附上之前的代碼:

self.deployTimeOutId = setTimeout(() => {
              self.getDeployList(false);
            }, 5000);

說明:這一段代碼是嵌在getDeployList方法中的,離開當前頁面的是時候,必須要去手動的把這個settimeout清除才行。一般這個寫在destoryed()這個鉤子里。

window.clearTimeout(this.deployTimeOutId);

雖然這樣處理了,但在邏輯比較復(fù)雜的情況下,還是出現(xiàn)了沒有關(guān)閉的情況,而且排查起來很痛苦。下面介紹一種針對Vue比較好的做法。

3.解決方案

  let self=this;
  if (self && !self._isDestroyed) {
            setTimeout(() => {
              if (self && !self._isDestroyed)
                self.getDeployList();
            }, 5000);
          }

_isDestroyed這個屬性表示的是當前這個組件是否有被銷毀,true表示當前的組件已經(jīng)被銷毀,通過上面這個判斷,我們就不需要自己手動的去用ID來清除了,這個就相當于遞歸嘛,有了一個結(jié)束判斷,避免了死循環(huán)咯~~

總結(jié)

以上所述是小編給大家介紹的vue項目開發(fā)中setTimeout等定時器的管理問題,希望對大家有所幫助,如果大家有任何疑問請

給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!

相關(guān)文章

  • vue綁定的點擊事件阻止冒泡的實例

    vue綁定的點擊事件阻止冒泡的實例

    下面小編就為大家分享一篇vue綁定的點擊事件阻止冒泡的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-02-02
  • 詳解如何添加babel?polyfill

    詳解如何添加babel?polyfill

    這篇文章主要介紹了詳解vue如何添加babel?polyfill實現(xiàn)方法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-06-06
  • vue2.x,vue3.x使用provide/inject注入的區(qū)別說明

    vue2.x,vue3.x使用provide/inject注入的區(qū)別說明

    這篇文章主要介紹了vue2.x,vue3.x使用provide/inject注入的區(qū)別說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • vue設(shè)置路由title,但刷新頁面時title失效的解決

    vue設(shè)置路由title,但刷新頁面時title失效的解決

    這篇文章主要介紹了vue設(shè)置路由title,但刷新頁面時title失效的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • 使用vue2.0創(chuàng)建的項目的步驟方法

    使用vue2.0創(chuàng)建的項目的步驟方法

    這篇文章主要介紹了使用vue2.0創(chuàng)建的項目的步驟方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-09-09
  • vue3中watch監(jiān)聽的四種寫法

    vue3中watch監(jiān)聽的四種寫法

    本文主要介紹了vue3中watch監(jiān)聽的四種寫法,包含了ref 定義的數(shù)據(jù),reactive定義的數(shù)據(jù),函數(shù)返回的值(getter函數(shù))和前面3個內(nèi)容的數(shù)組,具有一定的參考價值,感興趣的可以了了解一下
    2024-02-02
  • 簡單談?wù)刅ue 模板各類數(shù)據(jù)綁定

    簡單談?wù)刅ue 模板各類數(shù)據(jù)綁定

    Vue.js 的模板是基于 DOM 實現(xiàn)的。這意味著所有的 Vue.js 模板都是可解析的有效的 HTML,且通過一些特殊的特性做了增強。Vue 模板因而從根本上不同于基于字符串的模板,請記住這點。
    2016-09-09
  • Vue.js3.2的vnode部分優(yōu)化升級使用示例詳解

    Vue.js3.2的vnode部分優(yōu)化升級使用示例詳解

    這篇文章主要為大家介紹了Vue.js3.2的vnode部分優(yōu)化升級使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-07-07
  • Vue+Echarts實現(xiàn)繪制多設(shè)備狀態(tài)甘特圖

    Vue+Echarts實現(xiàn)繪制多設(shè)備狀態(tài)甘特圖

    這篇文章主要為大家詳細介紹了Vue如何結(jié)合Echarts實現(xiàn)繪制多設(shè)備狀態(tài)甘特圖,文中的示例代碼講解詳細,有需要的小伙伴可以跟隨小編一起學(xué)習一下
    2024-03-03
  • vue.js做一個簡單的編輯菜譜功能

    vue.js做一個簡單的編輯菜譜功能

    本文通過實例代碼給大家一個簡單的基于vue.js實現(xiàn)的編輯菜譜功能,代碼簡答易懂,非常不錯,具有參考借鑒價值,需要的朋友參考下吧
    2018-05-05

最新評論