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 指向正确。


相关推荐
mldong4 小时前
你的 Vue3 项目也能有钉钉同款审批流设计器:npm 装包,10 分钟画出第一条审批流
前端·vue.js
2分钟速写快排5 小时前
什么是 RAG?如何用 RAG 实现一个用户记忆?
前端·后端·ai编程
passerby60615 小时前
如何自己造一个时间处理库
前端·javascript·github
走到天涯海角6 小时前
react里面的长列表渲染优化
前端·react.js·前端框架
小羊没烦恼!7 小时前
Hello Web API系列教程——Web API与国际化
java·服务器·前端·javascript·php
北岛贰7 小时前
迷茫焦虑期,我做了一个带支付带官网的 AI 聊天虚拟恋人 App
前端·人工智能·后端
mayaairi8 小时前
Vue2 组件通讯(三):全局事件总线、PubSub、插槽与组件实例属性
前端·javascript·vue.js
kyriewen9 小时前
面试官问我:AI 都能写代码了,前端凭什么还值 25K
前端·javascript·人工智能
风骏时光牛马10 小时前
AI源码分析:拆解模型底层实现逻辑
前端
BillKu10 小时前
全局样式变量:CSS 自定义属性(--border-color)和SCSS 变量($border-color)的说明
javascript·css·scss