Vue.js設(shè)計(jì)與實(shí)現(xiàn)無(wú)限遞歸學(xué)習(xí)總結(jié)
棧溢出
const data = { foo: 1 } const obj = new Proxy(data, {/*...*/}) effect(() => obj.foo = obj.foo + 1)
此項(xiàng)操作會(huì)引起棧溢出:
Uncaught RangeError: Maximum call sack size exceeded
在此操作中, 會(huì)先讀取obj.foo
的值, 這會(huì)觸發(fā)track
操作, 將副作用函數(shù)入棧, 此時(shí)有加一并賦值, 此時(shí)會(huì)觸發(fā)trigger
操作, 將副作用函數(shù)出棧并執(zhí)行, 在這種情況下, 該副作用函數(shù)還在執(zhí)行中, 又開始下一次的執(zhí)行, 導(dǎo)致無(wú)限遞歸調(diào)用自己導(dǎo)致棧溢出報(bào)錯(cuò).
在這個(gè)操作中讀取與設(shè)置的是同一個(gè)副作用函數(shù)activeEffect
, 因此在trigger
要觸發(fā)時(shí)添加條件: 如果trigger
觸發(fā)的副作用函數(shù)與當(dāng)前執(zhí)行的副作用函數(shù)相同, 則不觸發(fā)執(zhí)行:
function trigger (target, key) { const depsMap = bucket.get(target) if (!depsMap) return const effects = depsMap.get(key) const effectsToRun = new Set() effects && effects.forEach(effectFn => { if (effectFn !== activeEffect) { effectsToRun.add(effectFn) } }) effectsToRun.forEach(effectFn => effectFn()) }
目前為止響應(yīng)式完整代碼
// 儲(chǔ)存副作用函數(shù)的桶 const bucket = new WeakMap() // 用于儲(chǔ)存被注冊(cè)的副作用的函數(shù) let activeEffect = undefined // 副作用函數(shù)棧 const effectStack = [] function cleanup (effectFn) { for (let itme of effectFn.deps) { itme.delete(effectFn) } effectFn.deps.length = [] } function effect (fn) { const effectFn = () => { cleanup(effectFn) // 調(diào)用當(dāng)前的副作用函數(shù)時(shí), 賦值給 全局變量 activeEffect = effectFn // 在調(diào)用副作用函數(shù)之前將該函數(shù)壓入棧 effectStack.push(effectFn) fn()
以上就是Vue.js設(shè)計(jì)與實(shí)現(xiàn)無(wú)限遞歸學(xué)習(xí)總結(jié)的詳細(xì)內(nèi)容,更多關(guān)于Vue.js無(wú)限遞歸的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
highCharts提示框中顯示當(dāng)前時(shí)間的方法
今天小編就為大家分享一篇關(guān)于highCharts提示框中顯示當(dāng)前時(shí)間的方法,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-01-01vue實(shí)現(xiàn)單點(diǎn)登錄的方式匯總
最近項(xiàng)目停工了,RageFrame的學(xué)習(xí)暫時(shí)告一段落,這一篇給大家分享下有關(guān)單點(diǎn)登錄的相關(guān)知識(shí),并提供一些demo給大家參考,對(duì)vue單點(diǎn)登錄的實(shí)現(xiàn)方式感興趣的朋友一起看看吧2021-11-11基于Vue實(shí)現(xiàn)HTML轉(zhuǎn)PDF并導(dǎo)出
這篇文章主要為大家介紹了三種方法,可以實(shí)現(xiàn)將HTML頁(yè)面轉(zhuǎn)為PDF并實(shí)現(xiàn)下載。文中的示例代碼講解詳細(xì),感興趣的小伙伴可以學(xué)習(xí)一下2022-04-04Vue3.0中的monorepo管理模式的實(shí)現(xiàn)
這篇文章主要介紹了Vue3.0中的monorepo管理模式的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-10-10