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

Vue3解析學(xué)習(xí)handlers 模塊

 更新時(shí)間:2026年02月15日 15:34:52   作者:death_ray  
這篇文章主要介紹了Vue3解析學(xué)習(xí)handlers 模塊的相關(guān)資料,需要的朋友可以參考下

本文基于個(gè)人對(duì)源碼的理解與整理,難免存在偏差或不完整之處,如果你有更深入的見解或發(fā)現(xiàn)錯(cuò)誤,期待一起探討與修正。

一、handlers 的核心設(shè)計(jì)目標(biāo)

一句話總結(jié):

不同數(shù)據(jù)結(jié)構(gòu),用不同的代理策略,做到“最小攔截 + 精確觸發(fā)”。

響應(yīng)式系統(tǒng)本質(zhì)上是兩件事:

  • 依賴收集(track):讀取時(shí)記錄依賴

  • 副作用觸發(fā)(trigger):寫入時(shí)觸發(fā)更新

但不同類型的數(shù)據(jù):

  • 變更方式不同

  • 可攔截能力不同

因此 Vue 把代理邏輯拆成三套:

類型變更方式Proxy 能力方案
Object屬性賦值可完整攔截baseHandlers
Array屬性 + 方法方法無法直接攔截重寫數(shù)組方法
Map/Set方法驅(qū)動(dòng)只能攔截 get返回重寫方法

這不是“復(fù)雜”,而是對(duì) JavaScript 語義邊界的工程妥協(xié)。

二、Object:類繼承體系

Object 的 handler 在 baseHandlers.ts 中,通過類繼承組織:

1. BaseReactiveHandler(抽象基類)

這是統(tǒng)一入口,負(fù)責(zé):

  • get 攔截

  • ref 解包

  • 深/淺響應(yīng)式遞歸

  • 依賴收集

核心職責(zé):

訪問屬性 → track → 返回響應(yīng)式值

2. MutableReactiveHandler(可變對(duì)象)

這是最常見的 reactive 版本:

set

觸發(fā)兩種操作類型:

  • TriggerOpTypes.ADD(新增屬性)

  • TriggerOpTypes.SET(修改已有屬性)

區(qū)分 ADD / SET 的意義在于:

新增屬性 ≠ 修改屬性

某些依賴只關(guān)心結(jié)構(gòu)變化(比如 for...in、Object.keys)。

deleteProperty

觸發(fā):

TriggerOpTypes.DELETE

has

用于:

key in obj

依賴收集:

TrackOpTypes.HAS

ownKeys

用于:

for...in / Object.keys / Reflect.ownKeys

依賴收集:

TrackOpTypes.ITERATE

這一步是很多人忽略的關(guān)鍵:

遍歷結(jié)構(gòu)本身也是依賴。

3. ReadonlyReactiveHandler(只讀)

只讀版本直接阻斷寫操作:

  • set → 警告 + 不執(zhí)行

  • deleteProperty → 警告 + 不執(zhí)行

但 讀取仍然會(huì) track。

因?yàn)橹蛔x不等于“無依賴”。

三、Array:方法重寫策略

數(shù)組的問題在于:

大部分變更不是通過屬性賦值,而是通過方法。

例如:

arr.push()
arr.splice()
arr.shift()

Proxy 無法直接攔截方法調(diào)用。

Vue3 的方案是:

在 get trap 中返回“重寫版本”的數(shù)組方法。

arrayInstrumentations.ts

返回“重寫版本”的方法對(duì)象。

當(dāng)訪問數(shù)組方法時(shí):

proxy.push

BaseReactiveHandler 的 get trap 會(huì)判斷:

是不是數(shù)組?
是不是被重寫的方法?

如果是:

→ 返回”重寫版本“方法

這些方法內(nèi)部:

  • 先暫停依賴收集(避免死循環(huán))

  • 調(diào)用原始數(shù)組方法

  • 手動(dòng) trigger

這就是:

用函數(shù)包裝模擬“方法攔截”。

四、Map / Set:工廠函數(shù)體系

集合類型比數(shù)組更極端:

所有變更都通過方法。

map.set()
map.delete()
set.add()

Proxy 能攔截的只有:

get

因此 Vue 采用純工廠函數(shù)模式,而不是類繼承。

1. 只攔截 get

collectionHandlers 的策略:

get → 返回重寫后的方法

和數(shù)組類似,但更徹底。

2. 四種 handler 組合

創(chuàng)建導(dǎo)出 4 個(gè)全局代理對(duì)象:

  • mutableCollectionHandlers(深響應(yīng)式)

  • shallowCollectionHandlers(淺響應(yīng)式)

  • readonlyCollectionHandlers(只讀)

  • shallowReadonlyCollectionHandlers(淺只讀)

這些不是手寫的,而是通過:

createInstrumentationsGetter(isReadonly, shallow)

動(dòng)態(tài)生成。

3. createInstrumentations 核心工廠

這個(gè)工廠函數(shù)負(fù)責(zé):

  • 構(gòu)造重寫后的 Map/Set 方法

  • 在方法內(nèi)部訪問原始對(duì)象

關(guān)鍵點(diǎn):

ReactiveFlags.RAW → 拿到原始數(shù)據(jù)

避免代理套代理導(dǎo)致的遞歸問題。

五、Track / Trigger 的精細(xì)控制

這是 Vue 3 響應(yīng)式系統(tǒng)的靈魂改進(jìn)之一。

讀取操作被分為:

  • GET

  • HAS

  • ITERATE

寫入操作被分為:

  • SET

  • ADD

  • DELETE

它們不是簡(jiǎn)單的一對(duì)一關(guān)系。

精確觸發(fā)的意義

關(guān)鍵規(guī)則:

并不是所有寫操作都應(yīng)該觸發(fā)所有依賴。

例如:

  • GET 依賴只關(guān)心 SET

  • ITERATE 依賴關(guān)心 ADD / DELETE

  • HAS 依賴只關(guān)心 key 是否存在

如果不區(qū)分:

任何寫操作 → 全部 effect 觸發(fā)

這會(huì)導(dǎo)致:

  • 不必要的重渲染

  • 性能雪崩

  • 副作用風(fēng)暴

Vue 2 的響應(yīng)式就屬于粗粒度觸發(fā)。

Vue 3 的 handlers 設(shè)計(jì)本質(zhì)是:

把“讀類型”和“寫類型”建立映射關(guān)系。

到此這篇關(guān)于Vue3解析學(xué)習(xí)handlers 模塊的文章就介紹到這了,更多相關(guān)Vue3 handlers 模塊內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Vue3 響應(yīng)式高階用法之triggerRef()的使用

    Vue3 響應(yīng)式高階用法之triggerRef()的使用

    在Vue3響應(yīng)式系統(tǒng)中,shallowRef僅追蹤頂層屬性的變化,當(dāng)需要對(duì)內(nèi)層屬性作出反應(yīng)時(shí),可使用triggerRef()方法手動(dòng)觸發(fā)更新,本文介紹了triggerRef()的應(yīng)用場(chǎng)景、基本用法、功能和最佳實(shí)踐,感興趣的可以了解一下
    2024-09-09
  • JavaScript 沙箱探索

    JavaScript 沙箱探索

    這篇文章主要介紹了JavaScript 沙箱探索,沙箱是基于 event bus 形式的通信實(shí)現(xiàn)上層的功能,文章的例子選擇接口實(shí)現(xiàn)了 web worker 與 quickjs 的 EventEmitter,,需要的朋友可以參考一下
    2021-10-10
  • 配置vite的proxy過程以及解決post請(qǐng)求403問題

    配置vite的proxy過程以及解決post請(qǐng)求403問題

    文章介紹了Vite項(xiàng)目中本地開發(fā)環(huán)境通過配置proxy代理實(shí)現(xiàn)跨域請(qǐng)求的方法,并解釋了生產(chǎn)環(huán)境中該配置不生效的情況,通常使用nginx轉(zhuǎn)發(fā)或后端配置CORS來解決,文章還指出,最終的請(qǐng)求地址是target加上rewrite重寫的地址
    2025-12-12
  • Vue數(shù)據(jù)驅(qū)動(dòng)表單渲染,輕松搞定form表單

    Vue數(shù)據(jù)驅(qū)動(dòng)表單渲染,輕松搞定form表單

    這篇文章主要介紹了Vue數(shù)據(jù)驅(qū)動(dòng)表單渲染,輕松搞定form表單,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-07-07
  • vue中三種插槽(默認(rèn)插槽/具名插槽/作用域插槽)的區(qū)別詳解

    vue中三種插槽(默認(rèn)插槽/具名插槽/作用域插槽)的區(qū)別詳解

    默認(rèn)插槽,具名插槽,作用域插槽是vue中常用的三個(gè)插槽,這篇文章主要為大家介紹了這三種插槽的使用與區(qū)別,感興趣的小伙伴可以了解一下
    2023-08-08
  • Vue3實(shí)現(xiàn)AI流式打字機(jī)的完整解決方案

    Vue3實(shí)現(xiàn)AI流式打字機(jī)的完整解決方案

    本文介紹了基于MessageChannel實(shí)現(xiàn)Vue AI流式對(duì)話的方案,通過SSE流式解析、時(shí)間切片、任務(wù)隊(duì)列等技術(shù),實(shí)現(xiàn)了非阻塞UI渲染和完美處理分包粘包問題,同時(shí)提供了一套可復(fù)用的Hook,并進(jìn)行了詳細(xì)的對(duì)比分析,需要的朋友可以參考下
    2026-04-04
  • Vue中關(guān)于this指向的問題示例詳解

    Vue中關(guān)于this指向的問題示例詳解

    在Vue中,方法體里用this調(diào)用vue實(shí)例的數(shù)據(jù),有時(shí)會(huì)指向window,導(dǎo)致調(diào)用失敗報(bào)錯(cuò),這篇文章主要介紹了Vue中關(guān)于this指向的問題 ,需要的朋友可以參考下
    2022-07-07
  • vue3父子組件通信之子組件修改父組件傳過來的值

    vue3父子組件通信之子組件修改父組件傳過來的值

    這篇文章主要介紹了vue3父子組件通信之子組件修改父組件傳過來的值,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧
    2024-05-05
  • Vue響應(yīng)式原理與虛擬DOM實(shí)現(xiàn)步驟詳細(xì)講解

    Vue響應(yīng)式原理與虛擬DOM實(shí)現(xiàn)步驟詳細(xì)講解

    在Vue中最重要、最核心的概念之一就是響應(yīng)式系統(tǒng)。這個(gè)系統(tǒng)使得Vue能夠自動(dòng)追蹤數(shù)據(jù)變化,并在數(shù)據(jù)發(fā)生變化時(shí)自動(dòng)更新相關(guān)的DOM元素。本文將會(huì)探討Vue響應(yīng)式系統(tǒng)的實(shí)現(xiàn)原理及其底層實(shí)現(xiàn)
    2023-03-03
  • Vue Ajax跨域請(qǐng)求實(shí)例詳解

    Vue Ajax跨域請(qǐng)求實(shí)例詳解

    這篇文章主要介紹了Vue Ajax跨域請(qǐng)求實(shí)例詳解,需要的朋友可以參考下
    2017-06-06

最新評(píng)論

台州市| 雅安市| 红河县| 民权县| 鹤峰县| 济宁市| 绥芬河市| 宁远县| 武鸣县| 岳池县| 虹口区| 林州市| 德安县| 朝阳县| 肥城市| 浦东新区| 白河县| 绩溪县| 青海省| 航空| 彭水| 奎屯市| 怀柔区| 芒康县| 宁南县| 本溪市| 金沙县| 安仁县| 乡宁县| 灌阳县| 隆化县| 洪湖市| 曲麻莱县| 翁源县| 铁岭县| 舟曲县| 榆树市| 达州市| 泽库县| 望奎县| 洪江市|