Vue reactive 底层 Proxy 完整流程(依赖收集 + 触发更新)

reactive 底层原理完整版(面试压轴题)

我给你讲最标准、最易懂、面试直接满分 的 reactive 底层原理,包含:
Proxy + Reflect + 依赖收集 track + 触发更新 trigger + 深度响应式

全程人话,不绕弯。


一、一句话终极结论

reactive = 深度 Proxy 代理 + get 收集依赖 + set 触发更新
Vue3 响应式的核心就是:拦截 → 收集 → 触发


二、reactive 底层 4 步流程

1. 把对象变成 Proxy 代理对象

reactive 接收一个对象,返回一个 Proxy 实例。

js 复制代码
const user = reactive({ name: "zs" })

底层:

js 复制代码
new Proxy(target, {
  get(target, key, receiver) {},
  set(target, key, value, receiver) {},
  deleteProperty(target, key) {}
})

2. get 时:依赖收集 track()

当渲染页面、computed、watch 读取数据时:

js 复制代码
user.name

触发 Proxy 的 get,执行:

  1. 用 Reflect.get 获取值
  2. 调用 track 收集当前副作用(组件更新函数)
  3. 如果值是对象 → 递归 reactive(深度响应)

3. set 时:触发更新 trigger()

当修改数据时:

js 复制代码
user.name = "ls"

触发 Proxy 的 set,执行:

  1. 用 Reflect.set 设置值
  2. 调用 trigger 通知所有收集到的副作用
  3. 组件重新渲染

4. 深度响应式原理

Proxy 默认只代理第一层 ,但 Vue3 在 get 里做了一件事:
拿到属性值 → 如果是对象 → 自动递归 reactive

所以任何层级修改都能响应。


三、超精简流程图

复制代码
读取属性 → get 拦截 → track 收集依赖
↓
修改属性 → set 拦截 → trigger 触发更新
↓
组件重新渲染

四、为什么要用 Reflect?

面试必问!

答案:

  1. 保证 this 指向正确
  2. 返回操作是否成功的布尔值
  3. 和 Proxy 配合最标准
js 复制代码
Reflect.get(target, key, receiver)

五、reactive 底层核心总结(背这个)

  1. reactive = Proxy 实现对象拦截
  2. get = track 收集依赖
  3. set = trigger 触发更新
  4. 深度响应 = get 时递归代理子对象
  5. 只能代理对象,不能代理基本类型
  6. 配合 Reflect 保证正确操作

六、面试满分答案(直接背)

问:Vue3 reactive 响应式原理?

答:
reactive 底层使用 ES6 Proxy 代理对象,通过 get 拦截进行依赖收集,set 拦截进行更新触发。
在 get 中使用 track 收集组件渲染副作用,在 set 中使用 trigger 通知依赖更新。
如果子属性是对象,会在读取时递归生成 reactive,实现深度响应式。
内部使用 Reflect 完成属性操作,保证 this 指向正确。


相关推荐
山雀~5 小时前
线上CI流水打包失败排查思路案例
前端·ci/cd
时间的情敌5 小时前
《回顾 2019 前端:React Hooks 问世,前端工程化爆发的一年》
前端·react.js·前端框架
燕落南枝5 小时前
CSS 类选择器详解:从入门到实战
前端·css
tryCbest5 小时前
Vue3——第 7 篇:组件基础——从注册到使用的完整流程
前端·javascript·vue.js
ai工具集合5 小时前
图标集用法,前端项目 SVG 图标 icon 完整接入实操
前端
门思科技5 小时前
ThinkLink 触发模型与告警规则实战:数据一小时才来一次,告警怎么做到不迟到、不刷屏、找对人
前端·后端
weixin_BYSJ19875 小时前
【计算机毕设】房屋租赁系统02647
java·vue.js·spring boot·python·django·课程设计
hunter_0765 小时前
从零读懂 SwiftUI 新拖放 API:用 Apple 的纸牌示例理解排序、多项拖拽与移动规则
前端
时间的情敌5 小时前
Electron 设置-webkit-app-region: drag;实现拖拽后, 无法响应鼠标划过事件及点击事件的解决方式
前端·vue.js
程序猿阿森6 小时前
深入解析 NLI:RAG 与大模型防幻觉的“最后一道防线”
前端·人工智能·算法