日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

$nextTick的原理及作用

作者:我年薪百萬 更新時間: 2023-10-09 編程語言

$nextTick 是 Vue.js 提供的一個方法,用于在 DOM 更新完成后執行回調函數。它是基于 JavaScript 的事件循環機制實現的。原理和作用如下:

原理
Vue 在更新 DOM 時是異步執行的。只要偵聽到數據變化,Vue 將開啟一個任務隊列,并緩沖在同一時間循環中發生的所有數據變更。如果同一個 watcher 被多次觸發,只會被推入到隊列中一次。(這種在緩沖時去除重復數據對于避免不必要的計算和 DOM 操作是非常重要的)
然后,在下一個的事件循環“tick”中,Vue 刷新隊列并執行任務隊列 (已去重的) 工作。
Vue 在內部對異步隊列嘗試使用原生的 Promise.then(微任務)、MutationObserver 和 setImmediate,如果執行環境不支持,則會采用 setTimeout(fn, 0)(宏任務)代替。

什么時候使用$nextTick
1、Vue?命周期的created()鉤?函數進?的DOM操作?定要放在Vue.nextTick()的回調函數中,原因是在created()鉤?函數執?的時候,DOM 其實并未進?任何渲染,?此時進?DOM操作?異于徒勞,所以此處?定要將DOM操作的js代碼放進Vue.nextTick()的回調函數中。

2、當項?中改變data函數的數據,想基于新的dom做點什么,對新DOM?系列的js操作都需要放進Vue.nextTick()的回調函數中
作用

  1. 等待 DOM 更新后執行操作:有時候你需要在 Vue 更新 DOM 后執行一些操作,例如操作更新后的 DOM 元素。使用 $nextTick 可以確保你的操作在 DOM 更新完成后執行。

  2. 避免不同數據更新之間的競態條件:如果你在數據更新后立即想要獲取更新后的 DOM 信息或進行操作,直接在數據更新后使用 $nextTick 會更可靠,避免競態條件。

示例代碼:

// 在 Vue 實例內部
this.$nextTick(function() {
  // DOM 已更新
  // 執行操作
});

// 在組件內部
this.$nextTick(function() {
  // DOM 已更新
  // 執行操作
});

JS 運行機制
JS 執行是單線程的,它是基于事件循環的。事件循環大致分為以下幾個步驟:

  1. 所有同步任務都在主線程上執行,形成一個執行棧
  2. 主線程之外,還存在一個"任務隊列"(task queue)。只要異步任務有了運行結果,就在"任務隊列"之中放置一個事件。
  3. 一旦"執行棧"中的所有同步任務執行完畢,系統就會讀取"任務隊列",看看里面有哪些事件。那些對應的異步任務,于是結束等待狀態,進入執行棧,開始執行。
  4. 主線程不斷重復上面的第三步。

主線程的執行過程就是一個 tick,而所有的異步結果都是通過 “任務隊列” 來調度。"任務隊列"中存放的是一個個的任務(task)。規范中規定 task 分為兩大類,宏任務和微任務
微任務,也稱job
通常用于在當前正在執行的腳本之后直接發生的事情,比如對一系列的行為做出反應,或者做出一些異步的任務,而不需要新建一個全新的task。只要執行棧沒有其他javascript在執行,在每個task結束時,微任務隊列就會在回調后處理。在微任務期間排隊的其他微任務將被添加到這個隊列的末尾
常見的 微任務 有 MutationObsever 、 Promise.then 、$nextTick

宏任務
作用是為了讓瀏覽器能夠從內部獲取javascript / dom的內容并確保執行棧能夠順序進行。調度是隨處可見的,例如解析HTML,獲得鼠標點擊的事件回調等等。
常見的 宏任務 有 setTimeout、MessageChannel、postMessage、setImmediate;

vue進行DOM更新內部也是調用nextTick來做異步隊列控制。而當我們自己調用nextTick的時候,它就在更新DOM的那個micro task后追加了我們自己的回調函數,從而確保我們的代碼在DOM更新后執行。

setTimeout是宏任務:只是延遲執行,在延遲執行的方法里,DOM有可能會更新也有可能沒有更新。

原文鏈接:https://blog.csdn.net/qq_60893085/article/details/133556306

  • 上一篇:沒有了
  • 下一篇:沒有了
欄目分類
最近更新