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

vue 實(shí)現(xiàn)setInterval 創(chuàng)建和銷毀實(shí)例

 更新時(shí)間:2020年07月21日 10:24:48   作者:暴暴君  
這篇文章主要介紹了vue 實(shí)現(xiàn)setInterval 創(chuàng)建和銷毀實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧

問題

setInterval 是間隔調(diào)用,與之類似的還有 setTimeout。這兩個(gè) API 通常用來做 ajax 短連接輪詢數(shù)據(jù)。

比如有一個(gè) logs.vue 是用來展示某個(gè)正在執(zhí)行的進(jìn)程產(chǎn)生的日志:

<template>
 <div>
 <p v-for="item in logList" :key="item.time">
  <span>{{"[" + item.time + "]"}}</span>
  <span>{{ item.log }}</span>
 </p>
 </div>
</template>
<script>
 import { Component, Vue, Watch, Prop, Emit } from 'vue-property-decorator'
 import { getLogList } from './api'
 @Component({})
 export default class extends Vue {
 logList = []
 timer = null
 mounted(){
  this.getData()
 }
 async getData(){
  let r = await getLogList()
  if(r && r.logList){
  this.logList = r.logList
  }
  this.timer = setTimeout(()=>{
  console.log(this.timer);
  this.getData()
  }, 1000)
 }
 beforeDestory(){
  clearTimeout(this.timer)
  this.timer = null;
 }
 }
</script>

這段代碼看上去沒啥問題,但是測(cè)試的時(shí)候你會(huì)發(fā)現(xiàn),有時(shí)候路由已經(jīng)跳轉(zhuǎn)了,獲取進(jìn)程日志的接口依然在不斷調(diào)用,甚至,有時(shí)候接口調(diào)用速度非???,一秒可能有好幾個(gè)請(qǐng)求。

分析

beforeDestory 是組件銷毀前的生命周期的鉤子,這個(gè)鉤子函數(shù)一定會(huì)調(diào)用,但是能不能徹底銷毀 setTimeout 呢?答案是不能。

打開控制臺(tái)就能看到不斷打印出來的 id

這是因?yàn)?,每次使?clearTimeout 清除掉的是上一次的 id, 而不是本次正要執(zhí)行的,這種情況,對(duì)于使用 setInterval 也是一樣的。

根本原因在于,每次調(diào)用 getData, this.timer 是在不斷的被賦予新的值,而不是一成不變的。

在以前的原生 js 中,我們通常這樣寫:

var timer = null
function init(){
 timer = setInterval(function(){
 getData()
 })
}
function getData(){}
window.onload = init
window.onunload = function(){
 clearInterval(timer)
}

由于上面的 timer 始終保持一個(gè)值,所以這里的清除是有效的

解決

vue 提供了 程序化的事件偵聽器 來處理這類邊界情況

按照文檔的說法,我們的代碼可以這樣來更改

<script>
 import { Component, Vue, Watch, Prop, Emit } from 'vue-property-decorator'
 import { getLogList } from './api'
 @Component({})
 export default class extends Vue {
 logList = []
 // timer = null
 mounted(){
  this.getData()
 }
 async getData(){
  let r = await getLogList()
  if(r && r.logList){
  this.logList = r.logList
  }
  const timer = setTimeout(()=>{
  this.getData()
  }, 1000)
  this.$once('hook:beforeDestroy', function () {
    clearTimeout(timer)
  })
 }
 }
</script>

這樣寫,還解決了兩個(gè)潛在問題

在組件實(shí)例中保存這個(gè) timer,最好只有生命周期鉤子有訪問它的權(quán)限。但是實(shí)例中的 timer 會(huì)視為雜物

如果建立代碼獨(dú)立于清理代碼,會(huì)使得我們比較難于程序化地清理所建立的東西

如果你是在項(xiàng)目中引入了 ts,那么可能會(huì)導(dǎo)致在組件銷毀的時(shí)候,定時(shí)器不能成功清除,這時(shí)候,你需要使用

const timer = window.setTimeout(()=>{
 this.getData()
}, 1000)
this.$once('hook:beforeDestroy', function () {
  window.clearTimeout(timer)
})

如果你漏掉了其中一個(gè) window,那么很可能會(huì)遇上類似的 ts 報(bào)錯(cuò):Type 'Timer' is not assignable to type 'number',這是因?yàn)?node typings

It seems like you are using node typings which override setInterval() as something that returns NodeJS.Timer. If you're running in the browser, it doesn't make a whole lot of sense to use these,

結(jié)論

我們可以通過 程序化的事件偵聽器 來監(jiān)聽銷毀我們創(chuàng)建的任何代碼示例

除了 setTimeout 和 setInterval ,通常還有一些第三方庫(kù)的對(duì)象示例,如 timePicker,datePicker,echarts圖表等。

mounted: function () {
 // Pikaday 是一個(gè)第三方日期選擇器的庫(kù)
  var picker = new Pikaday({
   field: this.$refs.input,
   format: 'YYYY-MM-DD'
  })
 // 在組件被銷毀之前,也銷毀這個(gè)日期選擇器。
  this.$once('hook:beforeDestroy', function () {
   picker.destroy()
  })
}

以上這篇vue 實(shí)現(xiàn)setInterval 創(chuàng)建和銷毀實(shí)例就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • vue template當(dāng)中style背景設(shè)置不編譯問題

    vue template當(dāng)中style背景設(shè)置不編譯問題

    這篇文章主要介紹了vue template當(dāng)中style背景設(shè)置不編譯問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-04-04
  • vue3結(jié)合ts從零實(shí)現(xiàn)vueuse的useRouteQuery方法

    vue3結(jié)合ts從零實(shí)現(xiàn)vueuse的useRouteQuery方法

    這篇文章主要為大家詳細(xì)介紹了如何使用vue3與ts從零實(shí)現(xiàn)一個(gè)類vueuse的useRouteQuery方法,并解決vueuse的useRouteQuery方法存在的一些問題,感興趣的可以了解下
    2024-03-03
  • Vue項(xiàng)目保持element組件同行,設(shè)置組件不自動(dòng)換行問題

    Vue項(xiàng)目保持element組件同行,設(shè)置組件不自動(dòng)換行問題

    這篇文章主要介紹了Vue項(xiàng)目保持element組件同行,設(shè)置組件不自動(dòng)換行問題。具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • 淺談VUE uni-app 生命周期

    淺談VUE uni-app 生命周期

    這篇文章主要介紹了uni-app 的生命周期,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-10-10
  • 詳解vue-cli腳手架中webpack配置方法

    詳解vue-cli腳手架中webpack配置方法

    這篇文章主要介紹了詳解vue-cli腳手架中webpack配置方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-08-08
  • Vue 集成 PDF.js 實(shí)現(xiàn) PDF 預(yù)覽和添加水印的步驟

    Vue 集成 PDF.js 實(shí)現(xiàn) PDF 預(yù)覽和添加水印的步驟

    這篇文章主要介紹了如何在 Vue 中集成 Mozilla/PDF.js ,實(shí)現(xiàn)自定義的 PDF 預(yù)覽器,以及給被預(yù)覽的 PDF 添加水印
    2021-01-01
  • vue中bus的使用及踩坑解決

    vue中bus的使用及踩坑解決

    這篇文章主要為大家詳細(xì)介紹了vue中bus的相關(guān)使用以及涉及到的問題與解決,文中的示例代碼簡(jiǎn)潔易懂,感興趣的小伙伴可以跟隨小編一起了解一下
    2023-08-08
  • Vue 自定義指令實(shí)現(xiàn)一鍵 Copy功能

    Vue 自定義指令實(shí)現(xiàn)一鍵 Copy功能

    指令 (Directives) 是帶有 v- 前綴的特殊特性。這篇文章主要介紹了Vue 自定義指令實(shí)現(xiàn)一鍵 Copy的功能,需要的朋友可以參考下
    2019-09-09
  • 詳解vue3中如何使用youtube-player

    詳解vue3中如何使用youtube-player

    這篇文章主要為大家介紹了詳解vue3中如何使用youtube-player示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09
  • Vue ECharts簡(jiǎn)易實(shí)現(xiàn)雷達(dá)圖

    Vue ECharts簡(jiǎn)易實(shí)現(xiàn)雷達(dá)圖

    這篇文章主要介紹了基于Vue ECharts簡(jiǎn)易實(shí)現(xiàn)雷達(dá)圖,本文通過實(shí)例代碼圖文相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-12-12

最新評(píng)論