深度解析 BaseHandlers 源码,看 Vue3 是如何拦截 Get 和 Set 操作的

风明小哥_4054

风明小哥_4054

2026-05-03

551人浏览

原创

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

深度解析 basehandlers 源码,看 vue3 是如何拦截 get 和 set 操作的

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-composition-api-best-practices

Vue 3 组合式 API 与

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
uni-app快速上手
uni-app快速上手

共0课时 | 0人学习

Vue 教程
Vue 教程

共42课时 | 17.2万人学习

Vue3.x 工具篇--十天技能课堂
Vue3.x 工具篇--十天技能课堂

共26课时 | 2.5万人学习