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

Vue3實(shí)現(xiàn)批量異步更新

 更新時(shí)間:2023年08月04日 09:44:44   作者:前端胖頭魚(yú)  
這篇文章主要為大家詳細(xì)介紹了Vue3批量異步更新是如何實(shí)現(xiàn)的,文中的示例代碼簡(jiǎn)潔易懂,具有一定的借鑒價(jià)值,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下

寫(xiě)在前面

這是Vue3源碼分析的第三篇,與響應(yīng)式系統(tǒng)中調(diào)度執(zhí)行有關(guān),其中computedwatch等核心功能都離不開(kāi)它,可見(jiàn)其重要程度。

除了實(shí)現(xiàn)可調(diào)度性,我們還會(huì)借助它來(lái)實(shí)現(xiàn)vue中一個(gè)非常重要的功能,批量更新或者叫異步更新

多次修改數(shù)據(jù)(例如自身num10次),只進(jìn)行一次頁(yè)面渲染(頁(yè)面只會(huì)渲染最后一次num10)。

什么是調(diào)度執(zhí)行

什么是調(diào)度執(zhí)行?

指的是響應(yīng)式數(shù)據(jù)發(fā)生變化出發(fā)副作用函數(shù)重新執(zhí)行時(shí),我們有能力去決定副作用函數(shù)的執(zhí)行時(shí)機(jī)次數(shù)方式。

來(lái)看個(gè)例子

const?state?=?reactive({
??num:?1
})
effect(()?=>?{
??console.log('num',?state.num)
})
state.num++
console.log('end')

如果我們想要它按照這個(gè)順序書(shū)序呢?

1
end
2

你可能會(huì)說(shuō),我調(diào)換一下代碼順序就好了哇!??!

const?state?=?reactive({
??num:?1
})
effect(()?=>?{
??console.log('num',?state.num)
})
console.log('end')
state.num++

瞬間就解決了問(wèn)題。不過(guò)看起來(lái)這不是我們想要最終答案。

我們想要通過(guò)實(shí)現(xiàn)可調(diào)度性來(lái)解決這個(gè)問(wèn)題。

如何實(shí)現(xiàn)可調(diào)度

我們從結(jié)果出發(fā)來(lái)思考如何實(shí)現(xiàn)可調(diào)度的特性。

const?state?=?reactive({
??num:?1
})
effect(()?=>?{
??console.log(state.num)
},?{
??//?注意這里,假如num發(fā)生變化的時(shí)候執(zhí)行的是scheduler函數(shù)
??//?那么end將會(huì)被先執(zhí)行,因?yàn)槲覀冇胹etTimeout包裹了一層fn
??scheduler?(fn)?{
????//?異步執(zhí)行
????setTimeout(()?=>?{
??????fn()
????},?0)
??}
})
state.num++
console.log('end')

看到這里也許你已經(jīng)明白了,我們將通過(guò)scheduler來(lái)自主控制副作用函數(shù)的執(zhí)行時(shí)機(jī)。

在這之前,執(zhí)行state.num++之后,console.log(state.num)將會(huì)被馬上執(zhí)行,而添加scheduler后,num發(fā)生變化后將執(zhí)行scheduler中的邏輯。

源碼實(shí)現(xiàn)

雖然可調(diào)度性在Vue中非常重要,但實(shí)現(xiàn)這個(gè)機(jī)制卻非常簡(jiǎn)單,我們甚至只要增加兩行代碼就可以搞定。

第一行代碼

//?增加options參數(shù)
const?effect?=?function?(fn,?options?=?{})?{
??const?effectFn?=?()?=>?{
???//?....
??}
??//?...
??//?將options參數(shù)掛在effectFn上,便于effectFn執(zhí)行時(shí)可以讀取到scheduler
??effectFn.options?=?options
}

第二行代碼

function?trigger(target,?key)?{
//?...
??effectsToRun.forEach((effectFn)?=>?{
????//?當(dāng)指定了scheduler時(shí),將執(zhí)行scheduler而不是注冊(cè)的副作用函數(shù)effectFn
????if?(effectFn.options.scheduler)?{
??????effectFn.options.scheduler(effectFn)
????}?else?{
??????effectFn()
????}
??})
}

是不是簡(jiǎn)單到離譜?

批量更新 & 異步更新

來(lái)看段詭異的代碼,請(qǐng)問(wèn)num會(huì)被執(zhí)行多少次?100還是101?

const?state?=?reactive({
??num:?1
})
effect(()?=>?{
??console.log('num',?state.num)
})
let?count?=?100
while?(count--)?{
??state.num++
}

對(duì)于頁(yè)面渲染來(lái)說(shuō)1到101中間的2~100僅僅只是過(guò)程,并不是最終的結(jié)果,處于性能考慮Vue只會(huì)渲染最后一次的101。

Vue是如何做到的呢?

利用可調(diào)度性,再加點(diǎn)事件循環(huán)的知識(shí),我們就可以做到這件事。

  • num的每次變化都會(huì)導(dǎo)致scheduler的執(zhí)行,并將注冊(cè)好的副作用函數(shù)存入jobQueue隊(duì)列,因?yàn)镾et本身的去重性質(zhì),最終只會(huì)存在一個(gè)fn
  • 利用Promise微任務(wù)的特性,當(dāng)num被更改100次之后同步代碼全部執(zhí)行結(jié)束后,then回調(diào)將會(huì)被執(zhí)行,此時(shí)num已經(jīng)是101,而jobQueue中也只有一個(gè)fn,所以最終只會(huì)打印一次101
?const?state?=?reactive({
??num:?1
})
const?jobQueue?=?new?Set()
const?p?=?Promise.resolve()
let?isFlushing?=?false
const?flushJob?=?()?=>?{
??if?(isFlushing)?{
????return
??}
??isFlushing?=?true
??//?微任務(wù)
??p.then(()?=>?{
????jobQueue.forEach((job)?=>?job())
??}).finally(()?=>?{
????//?結(jié)束后充值設(shè)置為false
????isFlushing?=?false
??})
}
effect(()?=>?{
??console.log('num',?state.num)
},?{
??scheduler?(fn)?{
????//?每次數(shù)據(jù)發(fā)生變化都往隊(duì)列中添加副作用函數(shù)
????jobQueue.add(fn)
????//?并嘗試刷新job,但是一個(gè)微任務(wù)只會(huì)在事件循環(huán)中執(zhí)行一次,所以哪怕num變化了100次,最后也只會(huì)執(zhí)行一次副作用函數(shù)
????flushJob()
??}
})
let?count?=?100
while?(count--)?{
??state.num++
}

到此這篇關(guān)于Vue3實(shí)現(xiàn)批量異步更新的文章就介紹到這了,更多相關(guān)Vue3異步更新內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • vue的el-select綁定的值無(wú)法選中el-option問(wèn)題及解決

    vue的el-select綁定的值無(wú)法選中el-option問(wèn)題及解決

    這篇文章主要介紹了vue的el-select綁定的值無(wú)法選中el-option問(wèn)題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-09-09
  • vue3實(shí)現(xiàn)高德地圖天氣小組件

    vue3實(shí)現(xiàn)高德地圖天氣小組件

    這篇文章主要為大家詳細(xì)介紹了如何使用vue3實(shí)現(xiàn)一個(gè)高德地圖天氣小組件,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-10-10
  • vue3圖片剪裁插件vue-img-cutter使用小結(jié)

    vue3圖片剪裁插件vue-img-cutter使用小結(jié)

    Vue.js是一款流行的JavaScript前端框架,很受用戶(hù)喜愛(ài),這篇文章主要介紹了vue3圖片剪裁插件vue-img-cutter使用小結(jié),本文結(jié)合示例代碼講解的非常詳細(xì),感興趣的朋友一起看看吧
    2024-01-01
  • vue實(shí)現(xiàn)移動(dòng)端圖片裁剪上傳功能

    vue實(shí)現(xiàn)移動(dòng)端圖片裁剪上傳功能

    這篇文章主要為大家詳細(xì)介紹了vue實(shí)現(xiàn)移動(dòng)端圖片裁剪上傳功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • Vue3組件渲染前的初始化過(guò)程

    Vue3組件渲染前的初始化過(guò)程

    Vue3?中一個(gè)組件從創(chuàng)建到掛在,會(huì)經(jīng)過(guò)3個(gè)重點(diǎn)步驟:創(chuàng)建組件實(shí)例,設(shè)置組件實(shí)例,創(chuàng)建并執(zhí)行帶副作用的渲染函數(shù),本文將著重講清?創(chuàng)建組件實(shí)例、設(shè)置組件實(shí)例?這兩個(gè)過(guò)程都做了什么,這部分邏輯很簡(jiǎn)單,但你會(huì)從中學(xué)習(xí)到?Vue?優(yōu)秀的實(shí)踐技巧,需要的朋友可以參考下
    2024-07-07
  • Vue 組件組織結(jié)構(gòu)及組件注冊(cè)詳情

    Vue 組件組織結(jié)構(gòu)及組件注冊(cè)詳情

    這篇文章主要介紹的是Vue 組件組織結(jié)構(gòu)及組件注冊(cè),為了能在模板中使用,這些組件必須先注冊(cè)以便 Vue 能夠識(shí)別。這里有兩種組件的注冊(cè)類(lèi)型:全局注冊(cè)和局部注冊(cè)。至此,我們的組件都只是通過(guò) Vue.component 全局注冊(cè)的,文章學(xué)詳細(xì)內(nèi)容,需要的朋友可以參考一下
    2021-10-10
  • vue echarts實(shí)現(xiàn)橫向柱狀圖

    vue echarts實(shí)現(xiàn)橫向柱狀圖

    這篇文章主要為大家詳細(xì)介紹了vue echarts實(shí)現(xiàn)橫向柱狀圖,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • vue強(qiáng)制刷新組件的三種方法

    vue強(qiáng)制刷新組件的三種方法

    在Vue中,強(qiáng)制刷新組件通常涉及到以下幾種方法,本文給大家列出了常見(jiàn)的三種vue強(qiáng)制刷新組件的方法,感興趣的朋友跟隨小編一起看看吧
    2024-04-04
  • vue實(shí)現(xiàn)登陸頁(yè)面開(kāi)發(fā)實(shí)踐

    vue實(shí)現(xiàn)登陸頁(yè)面開(kāi)發(fā)實(shí)踐

    本文主要介紹了vue實(shí)現(xiàn)登陸頁(yè)面開(kāi)發(fā)實(shí)踐,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-05-05
  • Vue3使用Univer Docs創(chuàng)建在線編輯Excel的示例代碼

    Vue3使用Univer Docs創(chuàng)建在線編輯Excel的示例代碼

    本文介紹了如何在Vue3項(xiàng)目中集成UniverDocs,一個(gè)基于Luckysheet的企業(yè)文檔與數(shù)據(jù)協(xié)同解決方案,指導(dǎo)了從安裝到在頁(yè)面中使用的步驟,以及注意事項(xiàng),如數(shù)據(jù)格式轉(zhuǎn)換和二次開(kāi)發(fā)的靈活性,需要的朋友可以參考下
    2025-04-04

最新評(píng)論

永定县| 攀枝花市| 彩票| 张北县| 玉山县| 崇明县| 陵川县| 太仓市| 宝兴县| 深水埗区| 康定县| 乡城县| 若羌县| 杭锦旗| 来宾市| 额济纳旗| 富裕县| 通道| 汶川县| 长治市| 清丰县| 岗巴县| 宁德市| 宜宾市| 达孜县| 庆阳市| 招远市| 临桂县| 黔江区| 龙山县| 竹山县| 怀安县| 鲁甸县| 涿州市| 晋江市| 象山县| 长岭县| 集安市| 凌源市| 德安县| 响水县|