帶你深入了解Vue.$nextTick(原理淺析)
這篇文章跟大家分享一下Vue純乾貨,介紹一下你不知道的Vue.nextTick,聊聊Vue.$nextTick的原理,希望對大家有幫助!
原理性的東西就會文字較多,請耐下心來,細細品味
Vue中DOM更新機制
當你氣勢洶洶地使用Vue大展宏圖的時候,突然發現,咦,我明明對這個數據進行更改了,但是當我獲取它的時候怎麼是上一次的值(本人比較懶,就不具體舉例了?)
此時,Vue就會說:「小樣,這你就不懂了吧,我的DOM是異步更新的呀!!!」
簡單的說,Vue的響應式並不是只資料發生變化之後,DOM立刻發生變化,而是依照一定的策略進行DOM的更新。這樣的好處是可以避免一些對DOM不必要的操作,提高渲染效能。 【相關推薦:vuejs影片教學、web前端開發】
#在Vue官方文件中是這樣說明的:
可能你還沒注意到,Vue非同步執行DOM更新。只要觀察到資料變化,Vue將開啟一個佇列,並緩衝在同一事件循環中發生的所有資料變更。如果同一個watcher被多次觸發,只會被推入到隊列中一次。這種在緩衝時去除重複資料對於避免不必要的計算和DOM操作上非常重要。然後,在下一個的事件循環「tick」中,Vue刷新佇列並執行實際 (已去重的) 工作。
白話一點就是說,其實這是和JS當中的事件循環是息息相關的,就是Vue不可能對每一個資料變化都做一次渲染,它會把這些變化先放在一個非同步的佇列當中,同時它也會對這個佇列裡面的操作進行去重,例如你修改了這個資料三次,它只會保留最後一次。這些變化是都可以透過佇列的形式保存起來,那現在的問題就來到了,那vue是在事件循環的哪個時機來修改DOM呢?
Vue有兩個選擇,一個是在本次事件循環的最後進行一次DOM更新,另一個是把DOM更新放在下一輪的事件循環當中。 z這時,尤雨溪拍了拍胸脯說:「這兩種方法,我都有!」 但因為這輪事件循環最後執行會比放在下一輪事件循環要快很多,所以Vue優先選擇第一種,只有當環境不支援的時候才觸發第二種機制。 (??開頭的連結讓你懂事件循環)
雖然效能上提高了很多,但這個時候問題就出現了,我們都知道在一輪事件循環中,同步執行堆疊中程式碼執行完成之後,才會執行非同步佇列當中的內容,那我們取得DOM的操作是一個同步的呀! !那豈不是雖然我已經把資料改掉了,但是它的更新異步的,而我在獲取的時候,它還沒有來得及改,所以會出現文章開頭的那個問題。
這。 。 。我確實需要進行這樣操作,那這麼辦呢? ?
沒關係啦,尤大很貼心的為我們提供了Vue.$nextTick()
Vue.$nextTick()
#其實一句話就可以把$nextTick
這個東西講明白:就是你放在$nextTick
當中的操作不會立即執行,而是等資料更新、DOM更新完成之後再執行,這樣我們拿到的肯定就是最新的了。
再準確一點來講就是$nextTick
方法將回呼延遲到下次DOM更新循環之後執行。 (看不懂這句人話的,可以看上面[狗頭])
意思我們都懂了,那$nextTick
是怎麼完成這個神奇的功能的呢?核心如下:
Vue
在內部對非同步佇列嘗試使用原生的Promise.then
、MutationObserver
和setImmediate
,如果執行環境不支持,則會採用setTimeout(fn, 0)
代替。
仔細地看這句話,你就可以發現這不就是利用 JavaScript 的這些非同步回呼任務佇列,來實作 Vue 框架中自己的非同步回呼佇列。這其實就是一個典型的將底層 JavaScript 執行原理應用到具體案例中的範例。
我在這裡稍微總結一下:就是$nextTick
將回呼函數放到微任務或巨集任務當中以延遲它地執行順序;(總結的也比較懶?)
重要的是理解原始碼中它的三個參數的意思:
- callback:我們要執行的操作,可以放在這個函數當中,我們沒執行一次
$nextTick
就會把回呼函數放到一個非同步佇列當中; - #pending:標識,用以判斷在某個事件循環中是否為第一次加入,第一次加入的時候才觸發非同步執行的佇列掛載
- timerFunc:用來觸發執行回呼函數,也就是
Promise.then
或MutationObserver
或setImmediate
或setTimeout
的過程
#之後,在看整個$nextTick
裡面的執行過程,其實就是把一個個$nextTick
中的回呼函數壓入到callback佇列當中,然後根據事件的性質等待執行,輪到它執行的時候,就執行一下,然後去掉callback佇列中對應的事件。
使用
說了這麼多,要怎麼用它?很簡單很簡單
mounted: function () { this.$nextTick(function () { // Code that will run only after the // entire view has been rendered }) }
使用場景
#created中取得DOM的操作需要使用它
就是我們上面的例子,你如果想要取得最新值,就用它
還有一些第三方外掛程式使用過程中,使用到的情況,具體問題具體分析
#補充
之前我一直搞不懂一個的問題,$nextTick
既然把它傳入的方法變成微任務了,那它和其它微任務的執行順序是怎麼樣的呢?
這簡單來說是誰先掛載Promise
物件的問題,在呼叫$nextTick
方法時就會將其閉包內部維護的執行佇列掛載到Promise
對象,在資料更新時Vue
內部首先就會執行$nextTick
方法,之後便將執行佇列掛載到了Promise
物件上,其實在明白Js
的Event Loop
模型後,將資料更新也看做一個$nextTick
方法的調用,並且明白$nextTick
方法會一次執行所有推入的回調,就可以明白執行順序的問題了
還有$nextTick
和nextTick
區別就是nextTick
多了一個context參數,用來指定上下文。但兩個的本質是一樣的,$nextTick
是實例方法,nextTick
是類別的靜態方法而已;實例方法的一個好處就是,自動給你綁定為呼叫實例的this
罷了。
以上是帶你深入了解Vue.$nextTick(原理淺析)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

熱門話題

PHP與Vue:完美搭檔的前端開發利器在當今網路快速發展的時代,前端開發變得愈發重要。隨著使用者對網站和應用的體驗要求越來越高,前端開發人員需要使用更有效率和靈活的工具來創建響應式和互動式的介面。 PHP和Vue.js作為前端開發領域的兩個重要技術,搭配起來可以稱得上是完美的利器。本文將探討PHP和Vue的結合,以及詳細的程式碼範例,幫助讀者更好地理解和應用這兩

在前端開發面試中,常見問題涵蓋廣泛,包括HTML/CSS基礎、JavaScript基礎、框架和函式庫、專案經驗、演算法和資料結構、效能最佳化、跨域請求、前端工程化、設計模式以及新技術和趨勢。面試官的問題旨在評估候選人的技術技能、專案經驗以及對行業趨勢的理解。因此,應試者應充分準備這些方面,以展現自己的能力和專業知識。

隨著網路技術的發展,前端開發變得日益重要。尤其是行動端設備的普及,更需要高效率、穩定、安全又易於維護的前端開發技術。而作為一門快速發展的程式語言,Go語言已經被越來越多的開發者所使用。那麼,使用Go語言進行前端開發行得通嗎?接下來,本文將為你詳細說明如何使用Go語言進行前端開發。先來看看為什麼要使用Go語言進行前端開發。很多人認為Go語言是一門

身為C#開發者,我們的開發工作通常包括前端和後端的開發,而隨著技術的發展和專案的複雜性提高,前端與後端協同開發也變得越來越重要和複雜。本文將分享一些前端與後端協同開發的技巧,以幫助C#開發者更有效率地完成開發工作。確定好介面規範前後端的協同開發離不開API介面的交互。要確保前後端協同開發順利進行,最重要的是定義好介面規格。接口規範涉及到接口的命

Django是一個由Python編寫的web應用框架,它強調快速開發和乾淨方法。儘管Django是web框架,但要回答Django是前端還是後端這個問題,需要深入理解前後端的概念。前端是指使用者直接和互動的介面,後端是指伺服器端的程序,他們透過HTTP協定進行資料的互動。在前端和後端分離的情況下,前後端程式可以獨立開發,分別實現業務邏輯和互動效果,資料的交

Go語言作為一種快速、高效的程式語言,在後端開發領域廣受歡迎。然而,很少有人將Go語言與前端開發聯繫起來。事實上,使用Go語言進行前端開發不僅可以提高效率,還能為開發者帶來全新的視野。本文將探討使用Go語言進行前端開發的可能性,並提供具體的程式碼範例,幫助讀者更了解這一領域。在傳統的前端開發中,通常會使用JavaScript、HTML和CSS來建立使用者介面

實作即時通訊的方法有WebSocket、Long Polling、Server-Sent Events、WebRTC等等。詳細介紹:1、WebSocket,它可以在客戶端和伺服器之間建立持久連接,實現即時的雙向通信,前端可以使用WebSocket API來創建WebSocket連接,並透過發送和接收訊息來實現即時通訊;2、Long Polling,是一種模擬即時通訊的技術等等

Vue是一個流行的JavaScript框架,被廣泛用於建立單頁面應用程式。它採用了響應式資料綁定和組件化架構,並提供了許多方便的工具和方法。在Vue中,當資料變更時,Vue會自動更新視圖以反映這些變更。但是,在某些情況下,我們需要在資料更新後立即操作DOM元素,例如當我們需要在清單中新增項目時。這時,我們可以使用Vue提供的$nextTick方法來非同步更新D
