網站首頁 編程語言 正文
$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()的回調函數中
作用:
-
等待 DOM 更新后執行操作:有時候你需要在 Vue 更新 DOM 后執行一些操作,例如操作更新后的 DOM 元素。使用
$nextTick
可以確保你的操作在 DOM 更新完成后執行。 -
避免不同數據更新之間的競態條件:如果你在數據更新后立即想要獲取更新后的 DOM 信息或進行操作,直接在數據更新后使用
$nextTick
會更可靠,避免競態條件。
示例代碼:
// 在 Vue 實例內部
this.$nextTick(function() {
// DOM 已更新
// 執行操作
});
// 在組件內部
this.$nextTick(function() {
// DOM 已更新
// 執行操作
});
JS 運行機制
JS 執行是單線程的,它是基于事件循環的。事件循環大致分為以下幾個步驟:
- 所有同步任務都在主線程上執行,形成一個執行棧
- 主線程之外,還存在一個"任務隊列"(task queue)。只要異步任務有了運行結果,就在"任務隊列"之中放置一個事件。
- 一旦"執行棧"中的所有同步任務執行完畢,系統就會讀取"任務隊列",看看里面有哪些事件。那些對應的異步任務,于是結束等待狀態,進入執行棧,開始執行。
- 主線程不斷重復上面的第三步。
主線程的執行過程就是一個 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
- 上一篇:沒有了
- 下一篇:沒有了
相關推薦
- 2022-05-20 ASP.NET?MVC模式中應用程序結構詳解_基礎應用
- 2022-12-12 python?使用?with?open()?as?讀寫文件的操作方法_python
- 2023-01-30 Android?Https證書過期的兩種解決方案_Android
- 2022-06-21 使用Apache?Hudi?加速傳統的批處理模式的方法_Linux
- 2022-08-29 Python繪制散點圖之可視化神器pyecharts_python
- 2022-12-26 C#操作xml文件之Linq?To?Xml詳解_C#教程
- 2023-01-21 VmWare安裝Centos后配置Net網絡SSH鏈接問題及解決_VMware
- 2023-03-01 shell?sleep睡眠命令的具體使用_linux shell
- 欄目分類
-
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支