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

Vue3解析學習handlers 模塊

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

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

一、handlers 的核心設計目標

一句話總結:

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

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

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

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

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

  • 變更方式不同

  • 可攔截能力不同

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

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

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

二、Object:類繼承體系

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

1. BaseReactiveHandler(抽象基類)

這是統(tǒng)一入口,負責:

  • get 攔截

  • ref 解包

  • 深/淺響應式遞歸

  • 依賴收集

核心職責:

訪問屬性 → track → 返回響應式值

2. MutableReactiveHandler(可變對象)

這是最常見的 reactive 版本:

set

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

  • TriggerOpTypes.ADD(新增屬性)

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

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

新增屬性 ≠ 修改屬性

某些依賴只關心結構變化(比如 for...in、Object.keys)。

deleteProperty

觸發(fā):

TriggerOpTypes.DELETE

has

用于:

key in obj

依賴收集:

TrackOpTypes.HAS

ownKeys

用于:

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

依賴收集:

TrackOpTypes.ITERATE

這一步是很多人忽略的關鍵:

遍歷結構本身也是依賴。

3. ReadonlyReactiveHandler(只讀)

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

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

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

但 讀取仍然會 track

因為只讀不等于“無依賴”。

三、Array:方法重寫策略

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

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

例如:

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

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

Vue3 的方案是:

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

arrayInstrumentations.ts

返回“重寫版本”的方法對象。

當訪問數(shù)組方法時:

proxy.push

BaseReactiveHandler 的 get trap 會判斷:

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

如果是:

→ 返回”重寫版本“方法

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

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

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

  • 手動 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)建導出 4 個全局代理對象:

  • mutableCollectionHandlers(深響應式)

  • shallowCollectionHandlers(淺響應式)

  • readonlyCollectionHandlers(只讀)

  • shallowReadonlyCollectionHandlers(淺只讀)

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

createInstrumentationsGetter(isReadonly, shallow)

動態(tài)生成。

3. createInstrumentations 核心工廠

這個工廠函數(shù)負責:

  • 構造重寫后的 Map/Set 方法

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

關鍵點:

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

避免代理套代理導致的遞歸問題。

五、Track / Trigger 的精細控制

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

讀取操作被分為:

  • GET

  • HAS

  • ITERATE

寫入操作被分為:

  • SET

  • ADD

  • DELETE

它們不是簡單的一對一關系。

精確觸發(fā)的意義

關鍵規(guī)則:

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

例如:

  • GET 依賴只關心 SET

  • ITERATE 依賴關心 ADD / DELETE

  • HAS 依賴只關心 key 是否存在

如果不區(qū)分:

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

這會導致:

  • 不必要的重渲染

  • 性能雪崩

  • 副作用風暴

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

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

把“讀類型”和“寫類型”建立映射關系。

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

相關文章

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

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

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

    JavaScript 沙箱探索

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

    配置vite的proxy過程以及解決post請求403問題

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

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

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

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

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

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

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

    Vue中關于this指向的問題示例詳解

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

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

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

    Vue響應式原理與虛擬DOM實現(xiàn)步驟詳細講解

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

    Vue Ajax跨域請求實例詳解

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

最新評論

方山县| 从江县| 礼泉县| 泌阳县| 丰镇市| 葵青区| 吴旗县| 盱眙县| 潞城市| 仪陇县| 溧水县| 麦盖提县| 张家界市| 惠水县| 安达市| 土默特左旗| 鹤壁市| 兴业县| 扶绥县| 凉山| 黄大仙区| 永泰县| 三亚市| 施甸县| 根河市| 白银市| 和硕县| 鄱阳县| 明星| 赤壁市| 武宣县| 宣汉县| 临清市| 繁峙县| 鲁甸县| 上杭县| 佛学| 廉江市| 西乌珠穆沁旗| 临朐县| 河东区|