最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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ì)大家有所幫助。一起跟隨小編過來(lái)看看吧

問題

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

比如有一個(gè) logs.vue 是用來(lái)展示某個(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)就能看到不斷打印出來(lá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 提供了 程序化的事件偵聽器 來(lái)處理這類邊界情況

按照文檔的說法,我們的代碼可以這樣來(lái)更改

<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é)論

我們可以通過 程序化的事件偵聽器 來(lái)監(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)文章

  • 使用Vue3實(shí)現(xiàn)一個(gè)簡(jiǎn)單的思維導(dǎo)圖組件

    使用Vue3實(shí)現(xiàn)一個(gè)簡(jiǎn)單的思維導(dǎo)圖組件

    思維導(dǎo)圖是一種用于表示信息、想法和概念的圖形化工具,本文將基于 Vue3和VueDraggable實(shí)現(xiàn)一個(gè)簡(jiǎn)單的思維導(dǎo)圖組件,支持節(jié)點(diǎn)拖拽,編輯及節(jié)點(diǎn)之間的關(guān)系連接,希望對(duì)大家有所幫助
    2025-04-04
  • vue3中effect函數(shù)到底是什么詳解

    vue3中effect函數(shù)到底是什么詳解

    Effect幾乎是Vue3.0中最重要的一個(gè)功能了,計(jì)算屬性監(jiān)聽函數(shù)都是基于effect實(shí)現(xiàn)的,下面這篇文章主要給大家介紹了關(guān)于vue3中effect函數(shù)到底是什么的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-06-06
  • vue init webpack 建vue項(xiàng)目報(bào)錯(cuò)的解決方法

    vue init webpack 建vue項(xiàng)目報(bào)錯(cuò)的解決方法

    今天小編就為大家分享一篇vue init webpack 建vue項(xiàng)目報(bào)錯(cuò)的解決方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧
    2018-09-09
  • Vue跳轉(zhuǎn)頁(yè)面的幾種常用方法總結(jié)

    Vue跳轉(zhuǎn)頁(yè)面的幾種常用方法總結(jié)

    在Vue.js中,頁(yè)面跳轉(zhuǎn)是構(gòu)建單頁(yè)面應(yīng)用(SPA)的基本操作之一,本文將介紹Vue中實(shí)現(xiàn)頁(yè)面跳轉(zhuǎn)的幾種方法,并通過實(shí)例代碼幫助理解每種方法的用法,需要的朋友可以參考下
    2024-09-09
  • vue項(xiàng)目中仿element-ui彈框效果的實(shí)例代碼

    vue項(xiàng)目中仿element-ui彈框效果的實(shí)例代碼

    這篇文章主要介紹了vue項(xiàng)目中仿element-ui彈框效果的實(shí)例代碼,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-04-04
  • vue.js+element 默認(rèn)提示中英文操作

    vue.js+element 默認(rèn)提示中英文操作

    這篇文章主要介紹了vue.js+element 默認(rèn)提示中英文實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧
    2020-11-11
  • Vue3 + TypeScript 開發(fā)總結(jié)

    Vue3 + TypeScript 開發(fā)總結(jié)

    本文直接上 Vue3 + TypeScript + Element Plus 開發(fā)的內(nèi)容,感興趣的話一起來(lái)看看吧
    2021-08-08
  • vue使用xlsx庫(kù)和xlsx-style庫(kù)導(dǎo)入導(dǎo)出excel、設(shè)置單元格背景色、文字居中、合并單元格、設(shè)置列寬

    vue使用xlsx庫(kù)和xlsx-style庫(kù)導(dǎo)入導(dǎo)出excel、設(shè)置單元格背景色、文字居中、合并單元格、設(shè)置列寬

    xlsx是由SheetJS開發(fā)的一個(gè)處理excel文件的npm庫(kù),適用于前端開發(fā)者實(shí)現(xiàn)導(dǎo)入導(dǎo)出excel文件的經(jīng)典需求,這篇文章主要介紹了vue使用xlsx庫(kù)和xlsx-style庫(kù)導(dǎo)入導(dǎo)出excel、設(shè)置單元格背景色、文字居中、合并單元格、設(shè)置列寬,需要的朋友可以參考下
    2023-11-11
  • vue混入mixin的介紹及理解

    vue混入mixin的介紹及理解

    混入(mixin)提供了一種非常靈活的方式,來(lái)分發(fā)vue組件中的可復(fù)用功能。一個(gè)混入對(duì)象可以包含任意組件選項(xiàng)。當(dāng)組件使用混入對(duì)象時(shí),所有混入對(duì)象的選項(xiàng)將被“混合”進(jìn)入該組件本身的選項(xiàng)
    2022-08-08
  • vue3中使用VueParticles實(shí)現(xiàn)粒子動(dòng)態(tài)背景效果

    vue3中使用VueParticles實(shí)現(xiàn)粒子動(dòng)態(tài)背景效果

    為了提高頁(yè)面展示效果,特別類似于登錄界面內(nèi)容比較單一的,粒子效果作為背景經(jīng)常使用到,vue工程中利用vue-particles可以很簡(jiǎn)單的實(shí)現(xiàn)頁(yè)面的粒子背景效果,本文給大家分享vue粒子動(dòng)態(tài)背景效果實(shí)現(xiàn)代碼,需要的朋友參考下吧
    2022-05-05

最新評(píng)論

天门市| 东乌| 资兴市| 林口县| 盖州市| 金塔县| 阿尔山市| 兴义市| 宜君县| 保山市| 宁陵县| 杨浦区| 启东市| 加查县| 徐州市| 青川县| 庐江县| 怀宁县| 策勒县| 讷河市| 闵行区| 繁峙县| 游戏| 司法| 合川市| 崇阳县| 景东| 麻城市| 鹤岗市| 苍溪县| 南汇区| 长汀县| 册亨县| 邻水| 泰顺县| 宾阳县| 肥西县| 新津县| 分宜县| 临洮县| 灵川县|