vue.nextTick()與setTimeout的區(qū)別及說(shuō)明
nextTick相當(dāng)于一個(gè)異步函數(shù):
- 在下次 DOM 更新循環(huán)結(jié)束之后執(zhí)行延遲回調(diào)。
- 在修改數(shù)據(jù)之后立即使用這個(gè)方法,獲取更新后的 DOM。
vue.nextTick()的使用場(chǎng)景
Vue中DOM渲染是在mounted()鉤子函數(shù)中,created()鉤子函數(shù)中DOM還未渲染,無(wú)法直接操作DOM
1、在Vue生命周期的created()鉤子函數(shù)進(jìn)行的DOM操作一定要放在Vue.nextTick()的回調(diào)函數(shù)中
在created()鉤子函數(shù)執(zhí)行的時(shí)候DOM 其實(shí)并未進(jìn)行任何渲染,而此時(shí)進(jìn)行DOM操作無(wú)異于徒勞,所以此處一定要將DOM操作的js代碼放進(jìn)Vue.nextTick()的回調(diào)函數(shù)中。
與之對(duì)應(yīng)的就是mounted()鉤子函數(shù),因?yàn)樵撱^子函數(shù)執(zhí)行時(shí)所有的DOM掛載和渲染都已完成,此時(shí)在該鉤子函數(shù)中進(jìn)行任何DOM操作都不會(huì)有問(wèn)題 。
<div id="app"> <ul> <li v-for="(item,index) in arr" :key="index">{{item}}</li> </ul> </div> <script> let app = new Vue({ data: { arr: [1,2,3], }, created() { console.log('created',document.querySelectorAll('li').length) this.$nextTick(()=>{ console.log('nextTick',document.querySelectorAll('li').length) document.querySelectorAll('li')[0].innerHTML="created中更改了按鈕內(nèi)容"; }) } }); </script>
2、當(dāng)項(xiàng)目中你想在改變DOM元素的數(shù)據(jù)后基于新的dom做點(diǎn)什么,對(duì)新DOM一系列的js操作都需要放進(jìn)Vue.nextTick()的回調(diào)函數(shù)中;
通俗的理解是:更改數(shù)據(jù)后當(dāng)你想立即使用js操作新的視圖的時(shí)候需要使用它
<div id="app"> <ul> <li v-for="(item,index) in arr" :key="index" @click="getAdd">{{item}}</li> </ul> </div> <script> let app = new Vue({ data: { arr: [1,2,3], }, methods: { getAdd(){ this.arr = [4,5,6,7]; this.$nextTick(()=>{ document.querySelectorAll('li')[3].innerHTML="33333333333333"; console.log('nextTick',document.querySelectorAll('li').length) }) }, }, created() { console.log('created',document.querySelectorAll('li').length) } }); </script>
li點(diǎn)擊后 頁(yè)面展示 由上圖更改為
如果不放在nextTick中
<div id="app"> <ul> <li v-for="(item,index) in arr" :key="index" @click="getAdd">{{item}}</li> </ul> </div> <script> let app = new Vue({ data: { arr: [1,2,3], }, methods: { getAdd(){ this.arr = [4,5,6,7]; document.querySelectorAll('li')[3].innerHTML="44444444444444"; console.log('methods',document.querySelectorAll('li').length) }, }, created() { console.log('created',document.querySelectorAll('li').length) } }); </script>
li點(diǎn)擊后報(bào)錯(cuò) 因?yàn)镈OM還未渲染
setTimeout
<div id="app"> <ul> <li v-for="(item,index) in arr" :key="index" @click="getAdd">{{item}}</li> </ul> </div> <script> let app = new Vue({ data: { arr: [1,2,3], }, methods: { getAdd(){ this.arr = [4,5,6,7]; setTimeout(() => { document.querySelectorAll('li')[3].innerHTML="44444444444444"; console.log('methods', document.querySelectorAll('li').length); }); }, }, created() { console.log('created',document.querySelectorAll('li').length) } }); </script>
li點(diǎn)擊后頁(yè)面展示為
nextTick與setTimeout都是異步函數(shù) 不同的是nextTick比setTimeout優(yōu)先執(zhí)行
原因:
- macro-task(宏任務(wù)):包括整體代碼script,setTimeout,setInterval
- micro-task(微任務(wù)):Promise,process.nextTick
- process.nextTick:process.nextTick(callback)類似node.js版的"setTimeout",在事件循環(huán)的下一次循環(huán)中調(diào)用 callback 回調(diào)函數(shù)。
- javascript是單線程
- setTimeout:因?yàn)橐胛⑷蝿?wù)隊(duì)列,即使是0最快也要4ms,要等待出隊(duì)。
宏任務(wù)的執(zhí)行時(shí)間大于微任務(wù)的執(zhí)行時(shí)間
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
vue實(shí)現(xiàn)經(jīng)典選項(xiàng)卡功能
這篇文章主要為大家詳細(xì)介紹了vue實(shí)現(xiàn)經(jīng)典選項(xiàng)卡功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03vue3+pinia用戶信息持久緩存token的問(wèn)題解決
本文主要介紹了vue3+pinia用戶信息持久緩存token的問(wèn)題解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07Vue Render函數(shù)創(chuàng)建DOM節(jié)點(diǎn)代碼實(shí)例
這篇文章主要介紹了Vue Render函數(shù)創(chuàng)建DOM節(jié)點(diǎn)代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-07-07vue.js中window.onresize的超詳細(xì)使用方法
這篇文章主要給大家介紹了關(guān)于vue.js中window.onresize的超詳細(xì)使用方法,window.onresize 是直接給window的onresize屬性綁定事件,只能有一個(gè),文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-12-12Ant Design Vue pro 動(dòng)態(tài)路由的實(shí)現(xiàn)和打包方式
這篇文章主要介紹了Ant Design Vue pro 動(dòng)態(tài)路由的實(shí)現(xiàn)和打包方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-06-06Vue3中的script?setup語(yǔ)法糖的使用及說(shuō)明
在這篇博客中,我們將探討?script?setup?的含義、好處以及示例代碼,幫助你更好地理解并在項(xiàng)目中合理運(yùn)用這一特性,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2025-03-03