nextTick能否獲取到最新dom原理解析
前言
眾所周知,vue的dom更新操作時(shí)異步的,為了獲取更新后的dom官方提供了相應(yīng)的apinextTick,文檔中對(duì)該api的描述為:將回調(diào)延遲到下次 DOM 更新循環(huán)之后執(zhí)行 , 所謂的下一次,到底是哪一次呢?dom更新是異步任務(wù),nextTick的回調(diào)也是異步任務(wù),nextTick的回調(diào)中一定就能獲取到最新的dom么?
nextTick的實(shí)現(xiàn)原理
vue2x中
出于兼容性考慮,依次判斷瀏覽器是否支持,選擇使用對(duì)應(yīng)api

優(yōu)先選擇微任務(wù),如果微任務(wù)都不支持,則選擇宏任務(wù)
vue3中:
拋棄了兼容性,直接使用Promise,來實(shí)現(xiàn)nextTick
結(jié)論
由nextTick的源碼可以看出,nextTick本質(zhì)就是創(chuàng)建了一個(gè)微任務(wù)(不考慮setTimeout),將其回調(diào)推入微任務(wù)隊(duì)列。vue中一個(gè)事件循環(huán)中的所有dom更新操作也是一個(gè)微任務(wù),兩者屬于同一優(yōu)先級(jí),執(zhí)行先后只于入隊(duì)的先后有關(guān),換句話說,如果你先寫了nextTick,再寫賦值語句(在此之前沒有觸發(fā)dom更新的操作),那在nextTick中獲取的可就不是更新后的dom了
示例說明
- 例如下面的代碼:
<template>
<div class="demo">
<p class="name">{{ name }}</p>
<button @click="modify">修改</button>
</div>
</template>
<script lang="ts" setup>
const name = ref("111");
const modify = () => {
name.value = "222"; // 關(guān)鍵的賦值語句,如果注釋掉,結(jié)果就大不一樣了
nextTick(() => {
const text = document.querySelector<HTMLElement>(".name").innerText;
console.log(text);
});
name.value = "333";
};
</script>
如上代碼,如果注釋掉name.value = "2222",雖然nextTick語句下面也有賦值操作:name.value = "3333";,但由于nextTick先進(jìn)入微任務(wù)隊(duì)列,所以回調(diào)先于dom更新執(zhí)行,所以是獲取的dom仍舊是舊的更新前的dom
- 圖解

以上就是nextTick能否獲取到最新dom原理解析的詳細(xì)內(nèi)容,更多關(guān)于nextTick獲取最新dom的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Vue學(xué)習(xí)筆記進(jìn)階篇之單元素過度
這篇文章主要介紹了Vue學(xué)習(xí)筆記進(jìn)階篇之單元素過度,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-07-07
詳解vue2.0監(jiān)聽屬性的使用心得及搭配計(jì)算屬性的使用
這篇文章主要介紹了vue2.0之監(jiān)聽屬性的使用心得及搭配計(jì)算屬性的使用,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-07-07
Vue使用三方工具vueUse實(shí)現(xiàn)虛擬列表
其實(shí)采用vueUse中的useVirtualList方法同樣可以實(shí)現(xiàn)虛擬列表,這篇文章小編就來和大家詳細(xì)介紹一下如何使用vueUse實(shí)現(xiàn)簡(jiǎn)單的虛擬列表效果吧2024-04-04
Vuex state中同步數(shù)據(jù)和異步數(shù)據(jù)方式
這篇文章主要介紹了Vuex state中同步數(shù)據(jù)和異步數(shù)據(jù)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-08-08
關(guān)于vue中的ajax請(qǐng)求和axios包問題
大家在vue中,經(jīng)常會(huì)用到數(shù)據(jù)請(qǐng)求問題,常用的有vue-resourse、axios ,今天小編給大家介紹下axios的post請(qǐng)求 ,感興趣的朋友跟隨腳本之家小編一起看看吧2018-04-04
vue axios攔截器常用之重復(fù)請(qǐng)求取消
我們大家在開發(fā)中,經(jīng)常會(huì)遇到接口重復(fù)請(qǐng)求導(dǎo)致的各種問題,下面這篇文章主要給大家介紹了關(guān)于axios攔截器之重復(fù)請(qǐng)求取消的相關(guān)資料,需要的朋友可以參考下2021-09-09

