亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

vue中nexttick的原理是什么

發布時間:2020-07-02 13:50:17 來源:億速云 閱讀:446 作者:元一 欄目:web開發

vue中nexttick的原理是什么?針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

Vue.nextTick是Vue官方給我們提供的一個API(方法),作用是在下次DOM更新循環結束之后執行延遲回調。在修改數據之后立即使用這個方法,獲取更新后的DOM;

當數據發生變化之后,DOM視圖并不會立即更新,如果我們在發生變化之后立馬去獲取某個節點或者某個節點的值,很有可能結果就是undefined;因為Vue實現響應式并不是數據發生變化之后DOM立即變化,而是按一定的策略進行DOM的更新。

一、原理

1.異步說明

Vue 實現響應式并不是數據發生變化之后 DOM 立即變化,而是按一定的策略進行 DOM 的更新。

2.事件循環說明

簡單來說,Vue在修改數據后,視圖不會立刻更新,而是等同一事件循環中的所有數據變化完成之后,再統一進行視圖更新。

eg:

vue中nexttick的原理是什么

圖解:

vue中nexttick的原理是什么

事件循環:

第一個tick(本次更新循環)

1.首先修改數據,這是同步任務。同一事件循環的所有的同步任務都在主線程上執行,形成一個執行棧,此時還未涉及DOM.

2.Vue開啟一個異步隊列,并緩沖在此事件循環中發生的所有數據變化。如果同一個watcher被多次觸發,只會被推入隊列中一次。

第二個tick(‘下次更新循環’)

同步任務執行完畢,開始執行異步watcher隊列的任務,更新DOM。Vue在內部嘗試對異步隊列使用原生的Promise.then和MessageChannel 方法,如果執行環境不支持,會采用 setTimeout(fn, 0) 代替。

第三個tick(下次 DOM 更新循環結束之后)

二、應用場景及原因

1.

  • 在Vue生命周期的created()鉤子函數進行的DOM操作一定要放在Vue.nextTick()的回調函數中

在created()鉤子函數執行的時候DOM 其實并未進行任何渲染,而此時進行DOM操作無異于徒勞,所以此處一定要將DOM操作的js代碼放進Vue.nextTick()的回調函數中。與之對應的就是mounted()鉤子函數,因為該鉤子函數執行時所有的DOM掛載和渲染都已完成,此時在該鉤子函數中進行任何DOM操作都不會有問題 。

  • 在數據變化后要執行的某個操作,而這個操作需要使用隨數據改變而改變的DOM結構的時候,這個操作都應該放進Vue.nextTick()的回調函數中。
2.在數據變化后要執行的某個操作,而這個操作需要使用隨數據改變而改變的DOM結構的時候,這個操作都應該放進Vue.nextTick()的回調函數中。

具體原因在Vue的官方文檔中詳細解釋:

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

例如,當你設置vm.someData = 'new value',該組件不會立即重新渲染。當刷新隊列時,組件會在事件循環隊列清空時的下一個“tick”更新。多數情況我們不需要關心這個過程,但是如果你想在 DOM 狀態更新后做點什么,這就可能會有些棘手。雖然 Vue.js 通常鼓勵開發人員沿著“數據驅動”的方式思考,避免直接接觸 DOM,但是有時我們確實要這么做。為了在數據變化之后等待 Vue 完成更新 DOM ,可以在數據變化之后立即使用Vue.nextTick(callback)。這樣回調函數在 DOM 更新完成后就會調用。

關于vue中nexttick的原理是什么問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

越西县| 遂昌县| 吴江市| 崇义县| 上饶市| 泰州市| 闸北区| 临漳县| 金塔县| 新蔡县| 大安市| 元谋县| 屯留县| 毕节市| 曲麻莱县| 光泽县| 凤冈县| 库尔勒市| 漳浦县| 祥云县| 洛南县| 苗栗县| 体育| 沿河| 城市| 石林| 噶尔县| 当雄县| 五家渠市| 陆良县| 汕尾市| 湘乡市| 文水县| 新巴尔虎左旗| 剑川县| 湖南省| 青浦区| 宣武区| 赤水市| 承德市| 莆田市|