vue.nextTick()與setTimeout的區(qū)別及說明
nextTick相當于一個異步函數(shù):
- 在下次 DOM 更新循環(huán)結束之后執(zhí)行延遲回調。
- 在修改數(shù)據(jù)之后立即使用這個方法,獲取更新后的 DOM。
vue.nextTick()的使用場景
Vue中DOM渲染是在mounted()鉤子函數(shù)中,created()鉤子函數(shù)中DOM還未渲染,無法直接操作DOM
1、在Vue生命周期的created()鉤子函數(shù)進行的DOM操作一定要放在Vue.nextTick()的回調函數(shù)中
在created()鉤子函數(shù)執(zhí)行的時候DOM 其實并未進行任何渲染,而此時進行DOM操作無異于徒勞,所以此處一定要將DOM操作的js代碼放進Vue.nextTick()的回調函數(shù)中。
與之對應的就是mounted()鉤子函數(shù),因為該鉤子函數(shù)執(zhí)行時所有的DOM掛載和渲染都已完成,此時在該鉤子函數(shù)中進行任何DOM操作都不會有問題 。
<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中更改了按鈕內容";
})
}
});
</script>


2、當項目中你想在改變DOM元素的數(shù)據(jù)后基于新的dom做點什么,對新DOM一系列的js操作都需要放進Vue.nextTick()的回調函數(shù)中;
通俗的理解是:更改數(shù)據(jù)后當你想立即使用js操作新的視圖的時候需要使用它
<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點擊后 頁面展示 由上圖更改為

如果不放在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點擊后報錯 因為DOM還未渲染

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點擊后頁面展示為

nextTick與setTimeout都是異步函數(shù) 不同的是nextTick比setTimeout優(yōu)先執(zhí)行
原因:
- macro-task(宏任務):包括整體代碼script,setTimeout,setInterval
- micro-task(微任務):Promise,process.nextTick
- process.nextTick:process.nextTick(callback)類似node.js版的"setTimeout",在事件循環(huán)的下一次循環(huán)中調用 callback 回調函數(shù)。
- javascript是單線程
- setTimeout:因為要入微任務隊列,即使是0最快也要4ms,要等待出隊。
宏任務的執(zhí)行時間大于微任務的執(zhí)行時間
總結
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
Vue Render函數(shù)創(chuàng)建DOM節(jié)點代碼實例
這篇文章主要介紹了Vue Render函數(shù)創(chuàng)建DOM節(jié)點代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-07-07
vue.js中window.onresize的超詳細使用方法
這篇文章主要給大家介紹了關于vue.js中window.onresize的超詳細使用方法,window.onresize 是直接給window的onresize屬性綁定事件,只能有一個,文中通過代碼介紹的非常詳細,需要的朋友可以參考下2023-12-12
Ant Design Vue pro 動態(tài)路由的實現(xiàn)和打包方式
這篇文章主要介紹了Ant Design Vue pro 動態(tài)路由的實現(xiàn)和打包方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-06-06

