透析Vue的nextTick原理

nextTick?是 Vue.js 中的一個核心機制,用于在?下一次 DOM 更新周期后?執行回調函數。它的核心原理是?利用 JavaScript 的事件循環機制(Event Loop),結合微任務(Microtask)或宏任務(Macrotask)的調度策略,確保回調在 DOM 更新完成后執行。


核心原理分析

1.?DOM 更新的異步性

Vue 的數據驅動視圖更新是?異步批量執行?的。當數據變化時,Vue 不會立即更新 DOM,而是開啟一個隊列,緩沖同一事件循環中的所有數據變更。這樣可以避免不必要的重復渲染,提高性能。

2.?回調隊列
  • 每次調用?nextTick(callback),Vue 會將?callback?推入一個?回調隊列

  • 當需要執行隊列時,Vue 會通過?異步任務調度器?觸發隊列中所有回調的執行。

3.?異步任務優先級

Vue 會優先使用?微任務(Microtask)?實現異步調度(因為微任務會在當前事件循環的末尾執行),但在不支持微任務的環境下會降級為?宏任務(Macrotask)。具體實現策略如下:

  • 現代瀏覽器:優先使用?Promise.then()(微任務)。

  • 不支持 Promise 的環境:降級到?MutationObserver(微任務)。

  • 其他環境(如舊版 IE):使用?setImmediate?或?setTimeout(fn, 0)(宏任務)。


源碼簡化邏輯

以下是 Vue 內部?nextTick?的簡化實現邏輯:

const callbacks = []; // 回調隊列
let pending = false; // 標記是否已向任務隊列添加任務function flushCallbacks() {pending = false;const copies = callbacks.slice(0);callbacks.length = 0; // 清空隊列for (let i = 0; i < copies.length; i++) {copies[i](); // 依次執行回調}
}function nextTick(callback) {callbacks.push(() => {if (callback) {try {callback();} catch (e) {handleError(e);}}});if (!pending) {pending = true;// 根據環境選擇異步策略if (typeof Promise !== 'undefined') {Promise.resolve().then(flushCallbacks);} else if (typeof MutationObserver !== 'undefined') {// 使用 MutationObserver 模擬微任務const observer = new MutationObserver(flushCallbacks);const textNode = document.createTextNode(String(counter));observer.observe(textNode, { characterData: true });textNode.data = String((counter + 1) % 2);} else {setTimeout(flushCallbacks, 0);}}
}

關鍵點總結

  1. 異步批量更新
    Vue 會將同一事件循環中的多個數據變更合并,避免頻繁的 DOM 操作。

  2. 微任務優先
    優先使用?Promise.then()?或?MutationObserver?觸發回調,確保回調在?當前事件循環的末尾(DOM 更新后)執行。

  3. 降級策略
    根據瀏覽器特性選擇合適的異步 API,確保兼容性。

  4. 回調隊列
    所有通過?nextTick?注冊的回調會被推入隊列,統一在下一個事件循環中執行。


使用場景

// 修改數據后,立即獲取更新后的 DOM
this.message = 'Updated';
this.$nextTick(() => {console.log(this.$el.textContent); // 輸出 'Updated'
});

總結

nextTick?的核心是通過?異步任務隊列?和?事件循環機制,確保回調在 DOM 更新完成后執行。這種設計既優化了性能(減少重復渲染),又保證了開發者能在正確時機獲取最新的 DOM 狀態。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/898579.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/898579.shtml
英文地址,請注明出處:http://en.pswp.cn/news/898579.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

WRF/Chem 模式技術解讀:為大氣污染治理提供有力支撐

技術點目錄 第一部分、WRF-Chem模式應用案例和理論基礎第二部分、Linux環境配置及WRF-CHEM第三部分、WRF-Chem模式編譯&#xff0c;排放源制作第四部分、WRF-Chem數據準備&#xff08;氣象、排放、初邊界條件等&#xff09;&#xff0c;案例實踐第五部分、模擬結果提取、數據可…

ccfcsp2701如此編碼

//如此編碼 #include<iostream> using namespace std; int main(){int n,m;cin>>n>>m;int a[21],b[21],c[21];for(int i1;i<n;i){cin>>a[i];}c[0]1;for(int i1;i<n;i){c[i]c[i-1]*a[i];}b[1](m%c[1])/c[0];int s1,s20;for(int i2;i<n;i){s2s2…

74HC04(反相器)和74HC14(反相器、施密特觸發器)的區別

74HC04和74HC14的具體區別詳解 同樣具有反相器功能&#xff0c;你知道74HC04和74HC14的具體區別嗎&#xff1f; 74HC04 對于74HC04很好理解&#xff0c;輸入低電平&#xff0c;輸出高電平&#xff1b;輸入高電平&#xff0c;輸出低電平。 建議操作條件&#xff1a; 下圖是TI的…

如何緩解大語言模型推理中的“幻覺”(Hallucination)?

目錄 如何緩解大語言模型推理中的“幻覺”&#xff08;Hallucination&#xff09;&#xff1f; 1. 什么是大語言模型的“幻覺”&#xff08;Hallucination&#xff09;&#xff1f; 幻覺的常見類型 2. 如何緩解大模型的幻覺問題&#xff1f; 方法 1&#xff1a;使用知識檢索…

Linux權限管理詳解

Linux權限管理系統 Linux作為一個多用戶操作系統&#xff0c;其權限管理系統是保障系統安全的重要組成部分。通過合理設置文件和目錄的權限&#xff0c;可以有效控制用戶對系統資源的訪問。 一、基本權限概念 Linux系統中的權限分為三類&#xff1a; 讀權限(r)&#xff1a;…

第十四次CCF-CSP認證(含C++源碼)

第十四次CCF-CSP認證 賣菜滿分思路 買菜滿分思路 再賣菜滿分題解&#xff08;差分約束&#xff09;solution 1(枚舉 correct but 超時)solution 2(正解) 賣菜 題目鏈接 滿分思路 就是模擬一下這個調整第二天菜價的過程&#xff0c;其中對于兩種只有一個鄰居的情況下做出調整&…

CCBCISCN復盤

AWDP – ccfrum 自己搭了一下環境, 復現一下這道題目, 之前比賽的時候完全沒想到這個漏洞要怎么打, 修也不知道要怎么修, 就僅僅是對用戶名的賬號和密碼進行了一下過濾, 完全沒起到作用, 唉, 實在太菜 如果想要嘗試復現的話可以嘗試拉取這個鏡像, 我打完之后就直接把這個容器給…

(每日一道算法題)交易逆序對的總數

LCR 170. 交易逆序對的總數 - 力扣&#xff08;LeetCode&#xff09; 在股票交易中&#xff0c;如果前一天的股價高于后一天的股價&#xff0c;則可以認為存在一個「交易逆序對」。請設計一個程序&#xff0c;輸入一段時間內的股票交易記錄 record&#xff0c;返回其中存在的「…

【操作系統】共享數據的競爭問題

共享數據的競爭問題 問題&#xff1a;保護中斷與主程序共享的avg_data方法一&#xff1a;使用關中斷保護1. 添加關中斷宏2. 修改數據讀取代碼3. 修改中斷服務程序&#xff08;ISR&#xff09; 方法二&#xff1a;使用原子操作&#xff08;需平臺支持&#xff09;1. 定義原子類型…

VS010生成可由MATLAB2016調用的DLL文件方法

親測實用&#xff0c;不用配置雜七雜八的依賴項 1&#xff1a;新建Win32的DLL輸出項目 2&#xff1a;修改為release模式 3&#xff1a;添加calc.cpp文件&#xff0c;即要導出的函數myadd&#xff1a; #include "calc.h" __declspec(dllexport) int myadd(int a,in…

機器學習Pandas_learn4

import pandas as pddef calculate_goods_covariance():# 定義商品銷售數據字典goods_sales_data {"時期": ["一期", "二期", "三期", "四期"],"蘋果": [15, 16, 3, 2],"橘子": [12, 14, 16, 18],&quo…

優選算法系列(3.二分查找 )

目錄 一.二分查找&#xff08;easy&#xff09; 題目鏈接&#xff1a;704. 二分查找 - 力扣&#xff08;LeetCode&#xff09; 解法&#xff1a; 代碼&#xff1a; 二.在排序數組中查找元素的第?個和最后?個位置&#xff08;medium&#xff09; 題目鏈接&#xff1a;34.…

DAY36貪心算法Ⅴ

56. 合并區間 - 力扣&#xff08;LeetCode&#xff09; class Solution { static bool cmp(vector<int>&a,vector<int>&b){return a[0] < b[0]; } public:vector<vector<int>> merge(vector<vector<int>>& intervals) {so…

阿里云服務器部署 五 Nginx + springboot

Nginx的部分配置 1. 基礎容災配置&#xff08;被動健康檢查&#xff09; 在 upstream 塊中&#xff0c;通過 max_fails 和 fail_timeout 參數定義故障轉移規則&#xff1a; 在 upstream 塊中&#xff0c;通過 max_fails 和 fail_timeout 參數定義故障轉移規則&#xff1a;…

基于大模型的下頜前突畸形預測及治療方案研究報告

目錄 一、引言 1.1 研究背景 1.2 研究目的 1.3 研究意義 二、大模型技術原理與應用現狀 2.1 大模型的基本原理 2.2 在醫療領域的應用案例 2.3 在下頜前突畸形研究中的可行性分析 三、下頜前突畸形概述 3.1 定義與分類 3.2 流行病學特征 3.3 病因與發病機制 3.4 對…

接口自動化測試框架詳解

&#x1f345; 點擊文末小卡片&#xff0c;免費獲取軟件測試全套資料&#xff0c;資料在手&#xff0c;漲薪更快 接口自動化測試是指通過編寫程序來模擬用戶的行為&#xff0c;對接口進行自動化測試。Python是一種流行的編程語言&#xff0c;它在接口自動化測試中得到了廣泛…

Day11 動態規劃入門

動態規劃 就是 : 給定一個問題&#xff0c;我們把它拆成一個個子問題&#xff0c;直到子問題可以直接解決。然后把子問題的答案保存起來&#xff0c;以減少重復計算。再根據子問題答案反推&#xff0c;得出原問題解的一種方法. 記憶化搜索 暴力dfs 記錄答案 動態規劃入門思…

[AI速讀]用持續集成(CI)優化芯片驗證環境:Jenkins與EDA工具的實戰指南

在芯片驗證中,回歸測試(Regression Test)是確保設計穩定性的關鍵步驟。但隨著設計復雜度增加,手動管理海量測試用例、分析日志和覆蓋率數據變得異常耗時。本文將介紹如何利用持續集成(CI)工具Jenkins,結合EDA驗證環境(如Cadence vManager),實現自動化測試與結果分析,…

深度解析:JavaScript變量聲明的演變與核心差異(var/let/隱式聲明)

深度解析&#xff1a;JavaScript變量聲明的演變與核心差異&#xff08;var/let/隱式聲明&#xff09; 一、JavaScript變量聲明的演進史 JavaScript的變量聲明機制經歷了三個階段演進&#xff1a; 原始階段&#xff08;ES5及之前&#xff09;&#xff1a;僅 var 聲明 隱式全局…

第2.1節:AWK腳本結構

1 第2.1節&#xff1a;AWK腳本結構 1.1 第1個awk腳本 假設有如下的數據待處理&#xff0c;需要將第2列提取出來&#xff1a; #, 名稱, 大小, 類型, 修改, 屬性 1, COMMIT_EDITMSG, 331 bytes, 文件, 24/09/16 08:42:19, -a----- 2, config, …