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

Vue nextTick的原理解析

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

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

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

Event Loop

Event Loop翻譯過(guò)來(lái)就是事件循環(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
    .....
```

也就是說(shuō)碰到以上幾種情況就會(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. 開(kāi)始執(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

我們開(kāi)始分析nextTick

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

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

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

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

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

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

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

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

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

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

最后就是setTimeout

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

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

那么接下來(lái)說(shuō)的就是重中之重

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

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

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

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

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

總結(jié)

nextTick并不是用來(lái)監(jiān)聽(tīng)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跨域問(wèn)題解決的詳細(xì)步驟

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

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

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

    這篇文章主要介紹了key在Vue列表渲染時(shí)究竟起到了什么作用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(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形式的特殊語(yǔ)法,sites是源數(shù)據(jù)數(shù)組并且site是數(shù)組元素迭代的別名,下面這篇文章主要給大家介紹了關(guān)于Vue中v-for列表循環(huán)的相關(guān)資料,需要的朋友可以參考下
    2022-11-11
  • Vue監(jiān)聽(tīng)數(shù)據(jù)渲染DOM完以后執(zhí)行某個(gè)函數(shù)詳解

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

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

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

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

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

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

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

    這篇文章主要介紹了Vue開(kāi)發(fā)之watch監(jiān)聽(tīng)數(shù)組、對(duì)象、變量操作,結(jié)合實(shí)例形式分析了vue.js使用Watch針對(duì)數(shù)組、對(duì)象、變量監(jiān)聽(tīng)相關(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),下面小編就來(lái)和大家詳細(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)核心方法,文圍繞主題展開(kāi)詳細(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í),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-04-04

最新評(píng)論

南安市| 洛阳市| 旬阳县| 博野县| 涟水县| 荔浦县| 翼城县| 梁河县| 太仆寺旗| 临汾市| 玛纳斯县| 思南县| 巴彦淖尔市| 永嘉县| 松原市| 怀柔区| 兰考县| 高淳县| 碌曲县| 辛集市| 上饶县| 陇川县| 安泽县| 沈阳市| 杭州市| 洛扎县| 武义县| 金坛市| 济阳县| 南昌市| 石泉县| 七台河市| 屯昌县| 泾川县| 绵竹市| 申扎县| 彩票| 江油市| 固始县| 武川县| 花莲县|