电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

vue 實現setInterval 創建和銷毀實例

瀏覽:89日期:2023-01-01 17:14:31

問題

setInterval 是間隔調用,與之類似的還有 setTimeout。這兩個 API 通常用來做 ajax 短連接輪詢數據。

比如有一個 logs.vue 是用來展示某個正在執行的進程產生的日志:

<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>

這段代碼看上去沒啥問題,但是測試的時候你會發現,有時候路由已經跳轉了,獲取進程日志的接口依然在不斷調用,甚至,有時候接口調用速度非常快,一秒可能有好幾個請求。

分析

beforeDestory 是組件銷毀前的生命周期的鉤子,這個鉤子函數一定會調用,但是能不能徹底銷毀 setTimeout 呢?答案是不能。

打開控制臺就能看到不斷打印出來的 id

vue 實現setInterval 創建和銷毀實例

這是因為,每次使用 clearTimeout 清除掉的是上一次的 id, 而不是本次正要執行的,這種情況,對于使用 setInterval 也是一樣的。

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

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

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

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

解決

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>

這樣寫,還解決了兩個潛在問題

在組件實例中保存這個 timer,最好只有生命周期鉤子有訪問它的權限。但是實例中的 timer 會視為雜物

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

如果你是在項目中引入了 ts,那么可能會導致在組件銷毀的時候,定時器不能成功清除,這時候,你需要使用

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

如果你漏掉了其中一個 window,那么很可能會遇上類似的 ts 報錯:Type ’Timer’ is not assignable to type ’number’,這是因為 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,

結論

我們可以通過 程序化的事件偵聽器 來監聽銷毀我們創建的任何代碼示例

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

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

以上這篇vue 實現setInterval 創建和銷毀實例就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持好吧啦網。

標簽: Vue
相關文章:
主站蜘蛛池模板: 龙门加工中心-数控龙门加工中心厂家价格-山东海特数控机床有限公司_龙门加工中心-数控龙门加工中心厂家价格-山东海特数控机床有限公司 | 移动厕所租赁|移动卫生间|上海移动厕所租赁-家瑞租赁 | 结晶点测定仪-润滑脂滴点测定仪-大连煜烁| 金联宇电缆总代理-金联宇集团-广东金联宇电缆实业有限公司 | AGV叉车|无人叉车|AGV智能叉车|AGV搬运车-江西丹巴赫机器人股份有限公司 | 钢托盘,钢制托盘,立库钢托盘,金属托盘制造商_南京飞天金属制品实业有限公司 | 即用型透析袋,透析袋夹子,药敏纸片,L型涂布棒-上海桥星贸易有限公司 | 光照全温振荡器(智能型)-恒隆仪器| 昆明网络公司|云南网络公司|昆明网站建设公司|昆明网页设计|云南网站制作|新媒体运营公司|APP开发|小程序研发|尽在昆明奥远科技有限公司 | 定硫仪,量热仪,工业分析仪,马弗炉,煤炭化验设备厂家,煤质化验仪器,焦炭化验设备鹤壁大德煤质工业分析仪,氟氯测定仪 | 深圳法律咨询【24小时在线】深圳律师咨询免费 | 杭州可当科技有限公司—流量卡_随身WiFi_AI摄像头一站式解决方案 | 淬火设备-钎焊机-熔炼炉-中频炉-锻造炉-感应加热电源-退火机-热处理设备-优造节能 | 制样机-密封锤式破碎机-粉碎机-智能马弗炉-南昌科鑫制样 | 首页|光催化反应器_平行反应仪_光化学反应仪-北京普林塞斯科技有限公司 | 细沙回收机-尾矿干排脱水筛设备-泥石分离机-建筑垃圾分拣机厂家-青州冠诚重工机械有限公司 | 亚克隆,RNAi干扰检测,miRNA定量检测-上海基屹生物科技有限公司 | 紫外线老化试验箱_uv紫外线老化试验箱价格|型号|厂家-正航仪器设备 | 在线浊度仪_悬浮物污泥浓度计_超声波泥位计_污泥界面仪_泥水界面仪-无锡蓝拓仪表科技有限公司 | 打孔器,打孔钳厂家【温州新星德牌五金工具】 | 隔爆型防爆端子分线箱_防爆空气开关箱|依客思 | 橡胶膜片,夹布膜片,橡胶隔膜密封,泵阀设备密封膜片-衡水汉丰橡塑科技公司网站 | 实战IT培训机构_IT培训班选大学生IT技术培训中心_中公优就业 | 锂离子电池厂家-山东中信迪生电源 | 台湾HIWIN上银直线模组|导轨滑块|TBI滚珠丝杆丝杠-深圳汉工 | 自动记录数据电子台秤,记忆储存重量电子桌称,设定时间记录电子秤-昆山巨天 | 厌氧反应器,IC厌氧反应器,厌氧三相分离器-山东创博环保科技有限公司 | 气象监测系统_气象传感器_微型气象仪_气象环境监测仪-山东风途物联网 | 【同风运车官网】一站式汽车托运服务平台,验车满意再付款 | 电池挤压试验机-自行车喷淋-车辆碾压试验装置-深圳德迈盛测控设备有限公司 | 滑石粉,滑石粉厂家,超细滑石粉-莱州圣凯滑石有限公司 | 2025世界机器人大会_IC China_半导体展_集成电路博览会_智能制造展览网 | 一体式钢筋扫描仪-楼板测厚仪-裂缝检测仪-泰仕特(北京) | 扬尘在线监测系统_工地噪声扬尘检测仪_扬尘监测系统_贝塔射线扬尘监测设备「风途物联网科技」 | 杭州代理记账多少钱-注册公司代办-公司注销流程及费用-杭州福道财务管理咨询有限公司 | 微型驱动系统解决方案-深圳市兆威机电股份有限公司 | 运动木地板厂家,篮球场木地板品牌,体育场馆木地板安装 - 欧氏运动地板 | Akribis直线电机_直线模组_力矩电机_直线电机平台|雅科贝思Akribis-杭州摩森机电科技有限公司 | 安徽合肥格力空调专卖店_格力中央空调_格力空调总经销公司代理-皖格制冷设备 | 铝机箱_铝外壳加工_铝外壳厂家_CNC散热器加工-惠州市铂源五金制品有限公司 | 北京易通慧公司从事北京网站优化,北京网络推广、网站建设一站式服务商-北京网站优化公司 |