解決vue 使用setTimeout,離開(kāi)當(dāng)前路由setTimeout未銷毀的問(wèn)題
問(wèn)題:
從第一個(gè)頁(yè)面跳轉(zhuǎn)到第二個(gè)頁(yè)面后,如果停留在第二個(gè)頁(yè)面,定時(shí)器還在運(yùn)行。如果在兩個(gè)頁(yè)面之間來(lái)回跳轉(zhuǎn),跳轉(zhuǎn)時(shí)間小于定時(shí)器的間隔時(shí)間時(shí),也會(huì)出現(xiàn)重復(fù)創(chuàng)建setTimeout的情況。
原因:
當(dāng)我們刷新頁(yè)面時(shí),會(huì)將當(dāng)前頁(yè)面之前創(chuàng)建的setTimeout以及其他定時(shí)器都清除掉,但是僅僅是路由切換是不會(huì)清除的。
data () {
return {
ct: null
}
},
methods: {
start() {
this.ct= setTimeout( () => {that.countdown(end)}, 1000)
}
end() {
clearTimeout(this.ct); //清除
}
}
setInterval()計(jì)時(shí)也需要clearInterval()來(lái)清除
補(bǔ)充知識(shí):小記VUE下setTimeOut和setInterval遇到的問(wèn)題
相信大家對(duì)著兩個(gè)函數(shù)都陌生,就是一個(gè)定時(shí)器,setTimeOut只執(zhí)行一次,而setInterval會(huì)重復(fù)執(zhí)行
需要注意的是:在setInterval不用的時(shí)候一定要用clearSetInterval關(guān)閉定時(shí)器。
說(shuō)一下最近開(kāi)發(fā)中遇到的問(wèn)題,我是用vue開(kāi)發(fā)的,順便記錄這個(gè)錯(cuò)誤。
我需要輪詢接口,所以使用setInterval。
// 我是想沒(méi)2秒執(zhí)行一次myFunc這個(gè)函數(shù)。
setInterval(this.myFunc(),2000)
//某個(gè)函數(shù)
myFunc () {
console.log(123)
}
但實(shí)際的運(yùn)行結(jié)果是,只執(zhí)行了一遍,并沒(méi)有循環(huán)執(zhí)行。
原因是setInterval接受兩個(gè)參數(shù),第一個(gè)為要執(zhí)行的函數(shù),第二個(gè)為時(shí)間(毫秒)。
這里我犯的錯(cuò)誤是,我寫的是一個(gè)函數(shù)的執(zhí)行this.myFunc() 因?yàn)榧恿耍ǎ┦且粋€(gè)執(zhí)行,而不是個(gè)函數(shù)。
于是我又改成這樣寫了,在寫個(gè)匿名函數(shù),函數(shù)體是我要執(zhí)行的。
setInterval(function () {
this.myFunc()
},2000)
//某個(gè)函數(shù)
myFunc () {
console.log(123)
}
理論上這樣是沒(méi)問(wèn)題的,會(huì)每2秒執(zhí)行一次this.myFunc(),但卻報(bào)錯(cuò)了。
原因是 老生常談的javaScript 的this 的問(wèn)題。
因?yàn)橛玫囊粋€(gè)function(){} 這里的 獨(dú)立的作用域 this指向了全局(這里是window)而且window里沒(méi)有myFunc這個(gè)函數(shù),所報(bào)了錯(cuò)。
用過(guò)vue的朋友應(yīng)該,基本vue中都是this.XXX這樣寫。這里的this是Vue對(duì)象。
所以為了使this正確指向vue,我用了ES6的尖頭函數(shù)。
最終
setInterval(() => {
this.myFunc()
},2000)
//某個(gè)函數(shù)
myFunc () {
console.log(123)
}
尖頭函數(shù)因?yàn)樗奶厥庑?,它的this指向它外層的對(duì)象。
其實(shí)主要說(shuō)的是第二個(gè)問(wèn)題,第一個(gè)屬于對(duì)函數(shù)不熟悉,第二個(gè)則是VUE,ES6,this指向綜合的問(wèn)題。
以上這篇解決vue 使用setTimeout,離開(kāi)當(dāng)前路由setTimeout未銷毀的問(wèn)題就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
vue項(xiàng)目實(shí)現(xiàn)中英文切換的詳細(xì)步驟
這篇文章主要給大家介紹了關(guān)于vue項(xiàng)目實(shí)現(xiàn)中英文切換的詳細(xì)步驟,項(xiàng)目中經(jīng)常有中英文切換的功能,接下來(lái)就簡(jiǎn)單實(shí)現(xiàn)以下這個(gè)功能,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考2023-11-11
vue如何自定義InputNumber計(jì)數(shù)器組件
這篇文章主要介紹了vue如何自定義InputNumber計(jì)數(shù)器組件問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-10-10
Vue + Webpack + Vue-loader學(xué)習(xí)教程之相關(guān)配置篇
這篇文章主要介紹了關(guān)于Vue + Webpack + Vue-loader的相關(guān)配置篇,文中通過(guò)示例代碼介紹的非常詳細(xì),相信對(duì)大家具有一定的參考價(jià)值,需要的朋友們下面來(lái)一起看看吧。2017-03-03
Vue導(dǎo)出excel的兩個(gè)常用方式介紹與對(duì)比
這篇文章主要為大家詳細(xì)介紹了Vue導(dǎo)出excel的兩個(gè)常用方式,分別為前端vue+XLSX導(dǎo)出excel和vue+后端POI?導(dǎo)出excel,感興趣的小伙伴可以了解下2025-01-01
vue項(xiàng)目打包之開(kāi)發(fā)環(huán)境和部署環(huán)境的實(shí)現(xiàn)
這篇文章主要介紹了vue項(xiàng)目打包之開(kāi)發(fā)環(huán)境和部署環(huán)境的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04

