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

優(yōu)先選擇微任務(wù),如果微任務(wù)都不支持,則選擇宏任務(wù)
vue3中:
拋棄了兼容性,直接使用Promise,來實現(xiàn)nextTick
結(jié)論
由nextTick的源碼可以看出,nextTick本質(zhì)就是創(chuàng)建了一個微任務(wù)(不考慮setTimeout),將其回調(diào)推入微任務(wù)隊列。vue中一個事件循環(huán)中的所有dom更新操作也是一個微任務(wù),兩者屬于同一優(yōu)先級,執(zhí)行先后只于入隊的先后有關(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先進入微任務(wù)隊列,所以回調(diào)先于dom更新執(zhí)行,所以是獲取的dom仍舊是舊的更新前的dom
- 圖解

以上就是nextTick能否獲取到最新dom原理解析的詳細內(nèi)容,更多關(guān)于nextTick獲取最新dom的資料請關(guān)注腳本之家其它相關(guān)文章!

