basehandlers 是 vue 3 响应式模块中定义的一组 proxy 处理器,包含 get/set/has/ownkeys 等 trap 实现,用于创建 reactive、readonly 等不同语义的响应式代理,其核心在于 get 中依赖收集(track)与 set 中更新触发(trigger),并按需提供 mutable、readonly、shallow 等多套变体以精确控制响应式行为。

Vue 3 的响应式系统核心依赖于 Proxy 和一系列 BaseHandlers,它不是直接拦截对象属性访问,而是通过精心设计的 get 和 set 捕获器,配合依赖收集与触发机制,实现细粒度、可追踪的响应式更新。
BaseHandlers 是什么?
BaseHandlers 是 Vue 3 响应式模块中定义的一组 Proxy 处理器(handler),位于 reactivity/src/baseHandlers.ts。它不直接暴露给用户,而是被 createReactiveObject 等内部函数调用,用于创建不同类型的响应式代理(如 reactive、readonly、shallowReactive)。
它本质上是一组预设的 get / set / has / ownKeys 等 trap 实现,其中 get 和 set 是最关键的两个。
Get 拦截:如何读取时收集依赖?
当访问响应式对象的某个属性(例如 obj.count)时,get trap 被触发。它的核心逻辑包括:
-
判断是否为内置 Symbol 方法或原型方法调用:如
obj.toString、obj[Symbol.iterator],这类访问不触发依赖收集,直接返回原始值或绑定 this 后返回。 -
对 ref 解包:若目标是 ref,且访问的是
.value,则自动解包并建立对 ref.value 的依赖;其他属性访问则按普通对象处理。 -
依赖收集(track):调用
track(target, 'get', key),将当前正在执行的副作用(effect)与该对象 + 属性的组合关联起来,存入依赖图(depsMap)中。 -
递归响应式包装:如果读取的值是对象或数组,且尚未被代理,则调用
reactive()包装它(惰性代理),确保深层响应式。
注意:只有在存在活跃的 effect(比如组件 render 函数执行中)时,track 才会真正注册依赖;否则跳过,避免无效收集。
vue-composition-api-best-practices
Vue 3 组合式 API 与
热门下载
相关下载
精品课程
相关推荐
/
热门推荐
/
最新课程
最新文章
