最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Vue nextTick的原理解析

 更新時(shí)間:2021年04月25日 08:58:23   作者:我在曾經(jīng)眺望彼岸  
這篇文章主要介紹了Vue nextTick的原理解析,幫助大家更好的理解和學(xué)習(xí)使用vue框架,感興趣的朋友可以了解下

使用過Vue的小伙伴們都知道,Vue里的nextTick可以獲取到更新后的DOM, 今天我就來講解下nextTick里面究竟做了什么?

開始講解前,我們需要知道了解一個(gè)概念,那就是Event Loop

Event Loop

Event Loop翻譯過來就是事件循環(huán), 一個(gè)Event Loop會(huì)包括一個(gè)或多個(gè)task隊(duì)列,持續(xù)線程會(huì)從隊(duì)列中取出最早進(jìn)入隊(duì)列的任務(wù)進(jìn)行執(zhí)行,被取出的任務(wù)就叫做macroTask(宏任務(wù)), 每個(gè)macroTask都有一個(gè)任務(wù)源, 每個(gè)macroTask處理完之后就從隊(duì)列中取出下一個(gè)時(shí)間最早進(jìn)入的macroTask再重執(zhí)行

任務(wù)源:

```
    1. script
    2. 事件
    3. Dom交互
    4. I/O
    5. UI Render
    6. setTimeout
    7. setInterval
    8. requestAnimationFrame
    .....
```

也就是說碰到以上幾種情況就會(huì)產(chǎn)生一個(gè)macroTask并且推入到隊(duì)列中

miscroTask(微任務(wù))

執(zhí)行完每個(gè)macroTask之后,主線程會(huì)去檢查該macroTask下的microTask是否為空,如果不為空,則按照時(shí)間順序從早到晚取出,如果途中有遇到新的microTask, 那么會(huì)繼續(xù)將該microTask推入到microTask隊(duì)列里

UI Render(重點(diǎn))

伴隨著miscroTask隊(duì)列的清空,主線程就會(huì)執(zhí)行UI Render, 也就是渲染界面,但是瀏覽器它并不會(huì)每次在UI Render任務(wù)下一定會(huì)渲染界面,視情況而言,現(xiàn)在主流瀏覽器一般都是按照60HZ 也就是16.7ms刷新頻率進(jìn)行渲染(不是精確估量),一個(gè)macroTask通常是小于16.7ms, 所以瀏覽器每次會(huì)根據(jù)情況進(jìn)行渲染

總結(jié)下一個(gè)循環(huán)

1. 從macroTask隊(duì)列里取出最早添加進(jìn)去的
2. 開始執(zhí)行task, 途中如果遇到新的macroTask,就會(huì)將其添加到macroTask隊(duì)列的最后面
3. 執(zhí)行完macroTask之后,event loop會(huì)去尋找microTask隊(duì)列
4. 同樣的道理,如果途中遇到新的microTask,將其放入該macroTask下的microTask隊(duì)列最后面
5. 執(zhí)行完microTask,會(huì)執(zhí)行UI Render macroTask
6. 瀏覽器會(huì)根據(jù)現(xiàn)有情況決定是否更新DOM,通常是按照60HZ的頻率去更新
7. 至此,一個(gè)event loop結(jié)束了

nextTick

我們開始分析nextTick

根據(jù)上圖
我們看到nextTick的幾種寫法:

    1. this.$nextTick(cb)
    2. this.$nextTick().then(cb)

所有的cb都會(huì)被放入到callbacks數(shù)組里,等待一次性調(diào)用
上圖中我們看到了主要是由timerFunc這個(gè)函數(shù)來進(jìn)行調(diào)用回調(diào), 那么我們下面來著重介紹這個(gè)函數(shù),首先看下源碼

我們可以看到timerFunc在不同情況下不同的賦值情況

首先會(huì)判斷瀏覽器是否支持promise屬性, 如果支持, timerFunc就會(huì)被賦值成Promise, 這里有個(gè)小小的問題,那就是在ios下,雖然是具備Pormise對(duì)象,并且會(huì)將它推入到microTask隊(duì)列里,但是隊(duì)列卻不會(huì)更新,這個(gè)時(shí)候需要添加一個(gè)macroTask來強(qiáng)制刷新microTask隊(duì)列

MutationObserver, 相信很多人并不清楚這個(gè)Api, 這是一個(gè)能夠監(jiān)聽DOM變化的API,并且屬于microTask, 優(yōu)先級(jí)低于Promise 在創(chuàng)建一個(gè)新的文本節(jié)點(diǎn)后,手動(dòng)更改其文本節(jié)點(diǎn)來觸發(fā)microTask,

這里會(huì)有個(gè)小小的問題:

該文本節(jié)點(diǎn)渲染成功后,一定能代表其他的DOM渲染成功了嗎?

這是個(gè)備選方案, 主要還是因?yàn)樗且粋€(gè)微任務(wù),所以才使用它,并不是因?yàn)樗O(jiān)聽了DOM

微任務(wù)都失敗后, 退而求其次,選擇setImmediate, 這是一個(gè)只有高版本IE和Edge瀏覽器才可能擁有的API, 其主要是用于計(jì)算大量數(shù)據(jù)的時(shí)候使用

最后就是setTimeout

看到這里,你會(huì)不會(huì)有疑惑?

上面的代碼并沒有說明nextTick是在監(jiān)聽DOM更新后才執(zhí)行的? What????當(dāng)時(shí)腦袋就duang了一下

那么接下來說的就是重中之重

DOM Tree的更新是實(shí)時(shí)的,DOM Tree的更新是實(shí)時(shí)的,DOM Tree的更新是實(shí)時(shí)的, 重要的事說3遍, 這意味著你無需去監(jiān)聽DOM 更新, 你對(duì)DOM的操作是能夠?qū)崟r(shí)得到反饋的,上一行代碼操作了DOM,下一行就能獲取到

那么有人就會(huì)產(chǎn)生疑惑了, nextTick究竟是干嘛的?

nextTick的作用是將收集Watcher從隊(duì)列中一個(gè)個(gè)取出,并且更改數(shù)據(jù),來一次性渲染DOM, 我們知道操作DOM的代價(jià)是昂貴的, 瀏覽器打開一個(gè)網(wǎng)頁后會(huì)開啟一個(gè)進(jìn)程,進(jìn)程是由線程組成的,

1. GUI渲染線程
2. js引擎線程(主線程)
3. EventLoop輪訓(xùn)處理線程
4. 其他線程,例如網(wǎng)絡(luò)

跨線程操作代價(jià)是昂貴的,所以做到一次性渲染Dom,可以有效的優(yōu)化性能!!

總結(jié)

nextTick并不是用來監(jiān)聽DOM變更,因?yàn)镈OM變更是能夠?qū)崟r(shí)獲取到的,它的作用是一次性更改數(shù)據(jù),并且渲染DOM

以上就是Vue nextTick的原理解析的詳細(xì)內(nèi)容,更多關(guān)于Vue nextTick的原理的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Django+vue跨域問題解決的詳細(xì)步驟

    Django+vue跨域問題解決的詳細(xì)步驟

    這篇文章主要介紹了Django+vue跨域問題解決的詳細(xì)步驟,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-01-01
  • 詳解key在Vue列表渲染時(shí)究竟起到了什么作用

    詳解key在Vue列表渲染時(shí)究竟起到了什么作用

    這篇文章主要介紹了key在Vue列表渲染時(shí)究竟起到了什么作用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • Vue中的v-for列表循環(huán)示例詳解

    Vue中的v-for列表循環(huán)示例詳解

    循環(huán)使用v-for指令,v-for指令需要以site in sites形式的特殊語法,sites是源數(shù)據(jù)數(shù)組并且site是數(shù)組元素迭代的別名,下面這篇文章主要給大家介紹了關(guān)于Vue中v-for列表循環(huán)的相關(guān)資料,需要的朋友可以參考下
    2022-11-11
  • Vue監(jiān)聽數(shù)據(jù)渲染DOM完以后執(zhí)行某個(gè)函數(shù)詳解

    Vue監(jiān)聽數(shù)據(jù)渲染DOM完以后執(zhí)行某個(gè)函數(shù)詳解

    今天小編就為大家分享一篇Vue監(jiān)聽數(shù)據(jù)渲染DOM完以后執(zhí)行某個(gè)函數(shù)詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-09-09
  • vue中使用v-if隱藏元素時(shí)會(huì)出現(xiàn)閃爍問題的解決

    vue中使用v-if隱藏元素時(shí)會(huì)出現(xiàn)閃爍問題的解決

    這篇文章主要介紹了vue中使用v-if隱藏元素時(shí)會(huì)出現(xiàn)閃爍問題的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-04-04
  • vue中路由參數(shù)傳遞可能會(huì)遇到的坑

    vue中路由參數(shù)傳遞可能會(huì)遇到的坑

    這篇文章主要給大家介紹了關(guān)于vue中路由參數(shù)傳遞遇到的坑的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-12-12
  • Vue開發(fā)之watch監(jiān)聽數(shù)組、對(duì)象、變量操作分析

    Vue開發(fā)之watch監(jiān)聽數(shù)組、對(duì)象、變量操作分析

    這篇文章主要介紹了Vue開發(fā)之watch監(jiān)聽數(shù)組、對(duì)象、變量操作,結(jié)合實(shí)例形式分析了vue.js使用Watch針對(duì)數(shù)組、對(duì)象、變量監(jiān)聽相關(guān)操作技巧,需要的朋友可以參考下
    2019-04-04
  • Vue3?Suspense實(shí)現(xiàn)優(yōu)雅處理異步數(shù)據(jù)加載

    Vue3?Suspense實(shí)現(xiàn)優(yōu)雅處理異步數(shù)據(jù)加載

    Suspense?是?Vue?3?中用于處理異步數(shù)據(jù)加載的特性,它使得在加載異步數(shù)據(jù)時(shí)可以提供更好的用戶體驗(yàn),下面小編就來和大家詳細(xì)講講Suspense如何優(yōu)雅處理異步數(shù)據(jù)加載吧
    2023-10-10
  • vue.js?Table?組件自定義列寬實(shí)現(xiàn)核心方法

    vue.js?Table?組件自定義列寬實(shí)現(xiàn)核心方法

    這篇文章主要介紹了vue.js?Table?組件自定義列寬實(shí)現(xiàn)核心方法,文圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-07-07
  • Vite?vue如何使用cdn引入element-plus

    Vite?vue如何使用cdn引入element-plus

    這篇文章主要介紹了Vite?vue使用cdn引入element-plus的相關(guān)知識(shí),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-04-04

最新評(píng)論

徐汇区| 岳池县| 九龙坡区| 商洛市| 祥云县| 华阴市| 锦州市| 屏东县| 蛟河市| 余江县| 广平县| 开原市| 北宁市| 南投县| 焉耆| 鄂托克旗| 麻城市| 德格县| 河池市| 获嘉县| 海南省| 通城县| 秭归县| 济阳县| 通化市| 张家界市| 巴林左旗| 平武县| 宁乡县| 通河县| 恭城| 商洛市| 营口市| 沙田区| 凤庆县| 汕头市| 威宁| 绵阳市| 安平县| 凭祥市| 彝良县|