Vue3 nextTick

nextTick?是 Vue 中非常重要的一個 API,它允許你在 DOM 更新周期后執行延遲回調。

核心源碼位置

Vue3 的?nextTick?實現主要在?packages/runtime-core/src/scheduler.ts?文件中。

基本實現

const resolvedPromise = Promise.resolve() as Promise<any>
let currentFlushPromise: Promise<void> | null = nullexport function nextTick<T = void>(this: T,fn?: (this: T) => void
): Promise<void> {const p = currentFlushPromise || resolvedPromisereturn fn ? p.then(this ? fn.bind(this) : fn) : p
}

關鍵點解析

  1. Promise 基礎:

    • 使用?Promise.resolve()?創建一個已解決的 Promise 作為基礎

    • 這樣即使沒有正在進行的更新,也能返回一個可用的 Promise

  2. currentFlushPromise:

    • 這個變量保存著當前正在進行的更新流程的 Promise

    • 如果有更新正在進行,nextTick?會返回這個 Promise 而不是基礎的?resolvedPromise

  3. 靈活的參數處理:

    • 可以不帶參數調用,只返回 Promise

    • 可以傳入回調函數,回調會在 Promise resolve 后執行

    • 支持綁定?this?上下文

執行流程

  1. 當組件狀態發生變化時,Vue 會安排一個異步更新隊列

  2. 這個更新隊列的執行會設置?currentFlushPromise

  3. 調用?nextTick?時:

    • 如果有更新正在進行(currentFlushPromise?存在),則回調會在這個 Promise 后執行

    • 如果沒有更新進行,則回調會在微任務隊列中立即執行

為什么使用 Promise

Vue 3 使用 Promise 作為?nextTick?的實現基礎,原因包括:

  1. 微任務優先級高于宏任務(如 setTimeout),能更早執行

  2. 現代瀏覽器廣泛支持 Promise

  3. 可以形成良好的 Promise 鏈式調用

與 Vue 2 的區別

Vue 2 中?nextTick?的實現更加復雜,有一個降級策略:

  1. 優先使用 Promise

  2. 不支持 Promise 時回退到 MutationObserver

  3. 再不支持則使用 setImmediate

  4. 最后使用 setTimeout

Vue 3 簡化了實現,因為現代瀏覽器已普遍支持 Promise,不再需要復雜的降級策略。

使用場景

import { nextTick } from 'vue'// 基本用法
nextTick(() => {// DOM 更新后執行
})// 配合 async/await
async function update() {// 修改數據this.message = 'updated'await nextTick()// 現在 DOM 已經更新
}

nextTick?是理解 Vue 響應式系統和更新機制的關鍵部分,它的簡潔實現體現了 Vue 3 對現代 JavaScript 特性的充分利用。

?

?

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

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

相關文章

DISCO:利用大型語言模型提取反事實

DISCO: Distilling Counterfactuals with Large Language Models - ACL Anthologyhttps://aclanthology.org/2023.acl-long.302/ 1. 概述 盡管在自然語言處理(NLP)領域針對各種推理任務取得了巨大進展(Wang 等, 2018, 2019a;Xu 等, 2020),但數據集偏差仍然是構建魯棒模型…

【Django】框架-路由系統核心概念解析

1. 最基本路由關系 路由是URL地址與處理邏輯&#xff08;視圖函數&#xff09;的對應關系。 本質&#xff1a;將用戶請求的URL路徑映射到具體的處理程序&#xff08;如Django視圖函數&#xff09;。 示例&#xff1a; # urls.py urlpatterns [ path(home/, views.home_…

理解 results = model(source, stream=True) 的工作原理和優勢

1. 核心概念解析 (1) streamTrue 的作用 生成器模式&#xff1a;當處理視頻或圖像序列時&#xff0c;streamTrue 會將結果包裝成一個 生成器&#xff08;Generator&#xff09;&#xff0c;逐幀生成 Results 對象&#xff0c;而不是一次性返回所有結果。內存優化&#xff1a;…

重新定義“邊緣”:邊緣計算如何重塑人類與數據的關系

在數字化浪潮中&#xff0c;云計算曾是科技界的寵兒&#xff0c;但如今&#xff0c;邊緣計算正在悄然改變游戲規則。它不僅是一種技術進步&#xff0c;更是對人類與數據關系的一次深刻反思。本文將探討邊緣計算如何從“中心化”走向“分布式”&#xff0c;以及它如何在效率、隱…

MCP 協議知識分享

MCP 協議知識分享 一、MCP 協議概述1.1 定義與背景1.2 核心價值1.3 與傳統 API 的對比 二、技術架構與工作原理2.1 核心組件2.2 通信機制2.3 典型工作流程 三、關鍵技術與應用場景3.1 核心技術3.2 典型應用場景 四、與微軟技術的集成4.1 Azure OpenAI 服務4.2 Playwright MCP 服…

策略模式實現 Bean 注入時怎么知道具體注入的是哪個 Bean?

Autowire Resource 的區別 1.來源不同&#xff1a;其中 Autowire 是 Spring2.5 定義的注解&#xff0c;而 Resource 是 Java 定義的注解 2.依賴查找的順序不同&#xff1a; 依賴注入的功能&#xff0c;是通過先在 Spring IoC 容器中查找對象&#xff0c;再將對象注入引入到當…

Linux》》bash 、sh 執行腳本

通常使用shell去運行腳本&#xff0c;兩種方法 》bash xxx.sh 或 bash “xxx.sh” 、sh xxx.sh 或 sh “xxx.sh” 》bash -c “cmd string” 引號不能省略 我們知道 -c 的意思是 command&#xff0c;所以 bash -c 或 sh -c 后面應該跟一個 command。

【解析】ReentrantLock鎖、Syschronized鎖面試點解析

面試官提問 ● 公平鎖與非公平鎖的區別是什么&#xff1f; ● 什么是可重入鎖&#xff1f; ● 什么是死鎖&#xff0c;怎樣避免死鎖&#xff1f; ● ReentrantLock與Syschronized實現原理是什么&#xff1f;兩者有什么區別&#xff1f; ● 請說明ReentrantLock獲取鎖與釋放…

04.Python代碼NumPy-通過索引或切片來訪問和修改

04.Python代碼NumPy-通過索引或切片來訪問和修改 提示&#xff1a;幫幫志會陸續更新非常多的IT技術知識&#xff0c;希望分享的內容對您有用。本章分享的是Python基礎語法。前后每一小節的內容是存在的有&#xff1a;學習and理解的關聯性&#xff0c;希望對您有用~ python語法…

跨平臺數據采集如何解決不同平臺之間的數據兼容性問題?

在數字化時代&#xff0c;企業越來越依賴多個信息系統來管理業務&#xff0c;例如ERP&#xff08;企業資源計劃&#xff09;、CRM&#xff08;客戶關系管理&#xff09;、財務管理系統、電商平臺等。然而&#xff0c;在進行跨平臺數據采集時&#xff0c;不同系統之間的數據格式…

解決 vite.config.ts 引入scss 預處理報錯

目錄 報錯1&#xff1a;[plugin:vite:css] [SASS] Error&#xff1a;Cant find stylesheet to import 報錯2&#xff1a;[plugin:vite:css] [sass] Error: Undefined variable 版本號&#xff1a; "sass": "^1.86.3","sass-loader": "^1…

C++筆記,數學函數

參考鏈接&#xff1a;C中數學函數的使用方法_cpp里指數函數-CSDN博客 頭文件 <cmath> 1. 基本的算數運算函數 1.1 sqrt() - 計算平方根 功能&#xff1a;計算一個非負實數的平方根。原型&#xff1a;double sqrt(double x);示例代碼&#xff1a; #include <iostr…

不關“貓”如何改變外網IP?3種免重啟切換IP方案

每次更換外網IP都要重啟路由器&#xff1f;太麻煩了&#xff01;那么&#xff0c;不關貓怎么改變外網IP&#xff1f;無論是為了網絡調試、爬蟲需求&#xff0c;還是解決IP限制問題&#xff0c;頻繁重啟設備既耗時又影響效率。其實&#xff0c;更換外網IP并不一定要依賴“重啟大…

道路運輸安全員企業負責人考試內容與范圍

道路運輸企業主要負責人&#xff08;安全員&#xff09;考證要求 的詳細說明&#xff0c;適用于企業法定代表人、分管安全負責人等需取得的 《道路運輸企業主要負責人和安全生產管理人員安全考核合格證明》&#xff08;交通運輸部要求&#xff09;。 考試內容與范圍 1. 法律法…

深入剖析 WiFi 定位解析功能:原理、技術優勢與應用場景

WiFi 定位解析功能的原理? 信號強度與距離的關系? WiFi 定位的核心原理基于無線信號傳播過程中的一個基本特性&#xff1a;信號強度與信號發射源&#xff08;即 WiFi 接入點&#xff0c;Access Point&#xff0c;簡稱 AP&#xff09;和接收設備之間距離的關聯。一般來說&am…

NVIDIA RTX? GPU 低成本啟動零售 AI 場景開發

零售行業正在探索應用 AI 升級客戶體驗&#xff0c;同時優化內部流程。面對多重應用場景以及成本優化壓力&#xff0c;團隊可采用成本相對可控的方案&#xff0c;來應對多重場景的前期項目預演和落地&#xff0c;避免短期內大規模投入造成的資源浪費。 客戶體驗 AI 場景的研究…

首次打藍橋杯總結(c/c++B組)

目錄 一、對每個題進行總結 1.填空題 2.第一個大題---可分解的正整數&#xff08;10--3&#xff09; 3.第二道大題---產值調整&#xff08;10--3&#xff09; 4.第三道大題---畫展部署&#xff08;15--7&#xff09; 5.第四道大題---水質檢測&#xff08;15--3&#x…

林納斯·托瓦茲:Linux系統之父 Git創始人

名人說&#xff1a;路漫漫其修遠兮&#xff0c;吾將上下而求索。—— 屈原《離騷》 創作者&#xff1a;Code_流蘇(CSDN)&#xff08;一個喜歡古詩詞和編程的Coder&#x1f60a;&#xff09; 林納斯托瓦茲&#xff1a;Linux之父、Git創始人 一、傳奇人物的誕生 1. 早年生活與家…

C語言多進程素數計算

題目描述&#xff1a; 以下代碼實現了一個多進程素數計算程序&#xff0c;通過fork()函數創建子進程來并行計算指定范圍內的素數。請仔細閱讀代碼并回答以下問題。 #include "stdio.h" #include "unistd.h" #include <sys/types.h> #include "…

uniapp-商城-27-vuex 通用方法

1 概述 上節說了vuex 的基本使用方法,分析了基本的使用方法。 在使用中,常見使用,我們要針對狀態,購物車,不同類事務的管理,如果按照上節課的通用方法,那么使用和維護是會很大的難度的。 所以這里就必須要進行處理,借助 modules 進行定義不同類事務的處理手段。便于…