Vue3 深入响应式系统

一、一句话终极总结(背这个)

Vue3 响应式 = Proxy 代理 + Reflect 操作 + get 收集依赖 + set 触发更新 + 副作用调度更新

它是一套自动追踪数据变化、自动更新视图的系统。


二、响应式核心四件套

  1. Proxy:劫持对象的读取、修改、删除
  2. Reflect:安全操作对象属性
  3. track:收集依赖(谁用了这个数据)
  4. trigger:触发更新(数据变了通知谁)

三、完整底层流程(最核心)

第一步:创建响应式对象

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

底层:

  • 传入对象 → 创建 Proxy 代理
  • 劫持 get / set / deleteProperty

第二步:读取数据 → 收集依赖 track()

js 复制代码
<div>{{ state.name }}</div>

执行:

  1. 读取 state.name → 触发 Proxy get
  2. 调用 track() 收集当前组件的渲染副作用
  3. 建立映射:target -> key -> effect

第三步:修改数据 → 触发更新 trigger()

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

执行:

  1. 修改 state.name → 触发 Proxy set
  2. 调用 trigger() 找到收集的副作用
  3. 把副作用加入队列,等待执行

第四步:执行副作用 → 更新视图

  • 异步队列执行渲染函数
  • 页面更新

四、依赖收集的完整结构(源码级)

Vue 用一个三层 Map 存储依赖:

复制代码
targetMap (WeakMap)
  ↓
  key: 原对象
  value: depsMap (Map)
          ↓
          key: 属性名
          value: dep (Set)
                  ↓
                  存放 effect(组件更新函数)

一句话:
哪个对象 → 哪个属性 → 被哪些组件使用


五、ref 到底是什么?(深入版)

js 复制代码
const count = ref(0)

底层是一个 RefImpl 类

  • get value() 收集依赖
  • set value() 触发更新
  • 如果传入对象 → 自动调用 reactive
  • 如果是基本类型 → 直接存取器监听

六、computed 底层(懒计算 + 缓存)

  1. 自带 lazy 懒执行
  2. 缓存,依赖不变不会重新计算
  3. 本质是一个 特殊的 effect

七、watch 底层

  1. 本质是一个 scheduler 调度器
  2. 监听指定数据
  3. 变化时执行回调
  4. 支持 deep / immediate / flush

八、Vue3 响应式流程图

复制代码
创建 reactive/ref
   ↓
页面渲染 → 读取属性 → get 拦截 → track 收集依赖
   ↓
修改属性 → set 拦截 → trigger 触发更新
   ↓
执行 effect → 重新渲染

九、面试终极 10 问(答案直接背)

1. Vue3 响应式原理?

Proxy 代理对象,get 收集依赖,set 触发更新,依赖存储在 targetMap,更新时执行副作用。

2. 为什么用 Proxy 不用 defineProperty?

  • 支持新增/删除属性
  • 支持数组全操作
  • 惰性监听,性能更高
  • 支持 13 种拦截

3. ref 和 reactive 区别?

  • ref 支持所有类型,reactive 只支持对象
  • ref 需要 .value
  • ref 底层是 class,reactive 是 Proxy

4. 依赖收集收集了什么?

收集了组件的渲染副作用(更新函数)

5. 为什么要用 Reflect?

  • 保证 this 正确
  • 有返回值
  • 配合 Proxy 标准操作

6. shallowRef/shallowReactive 原理?

不递归代理,只监听第一层,修改内部不触发更新。

7. reactive 赋值丢失响应式?

reactive 是 Proxy 对象,直接赋值变成普通对象。

8. toRef/toRefs 作用?

解构 reactive 时保持响应式。

9. computed 和 watch 区别?

  • computed 有缓存,必须 return
  • watch 无缓存,执行副作用

10. Vue3 响应式有什么缺点?

  • 解构会丢失响应式
  • 代理对象不等于原对象
  • 某些第三方库实例不能代理

十、最终超级总结

Vue3 响应式 = Proxy + track + trigger + effect

  • 读取 → 收集依赖
  • 修改 → 触发更新
  • ref 处理基本类型
  • reactive 处理对象
  • computed 缓存
  • watch 监听
相关推荐
竹林8182 小时前
从 ethers.js 迁移到 Viem:一个签名验证 Bug 让我彻底放弃旧爱
javascript
Hyyy2 小时前
很多Desktop都在上的Computer Use是什么
前端·llm
慢功夫2 小时前
开篇:VS Code 为什么不是一个普通 React App
前端·visual studio code
你挚爱的强哥3 小时前
Vue2 实现 1.5s 十连击监听(连续点击若干次),封装通用可复用点击检测工具,不用 data!Vue 封装通用连击监听方法,支持自定义时长与点击次数
前端·javascript·vue.js
半个落月3 小时前
用 LangChain.js 手写一个能读写文件和执行命令的 Mini Cursor
javascript·人工智能·后端
天外天-亮3 小时前
HBuilder X 使用 uview-plus 方式
开发语言·javascript·hbuilder x·uview-plus
huashengzsj3 小时前
Shopify个人建站如何搭建独立站:从零开始的完整指南
前端·网络·人工智能
程序猿小泓3 小时前
从 Claude Code 学 Agent Harness:一个前端工程师的 AI Agent 学习笔记
前端·人工智能·学习
柒和远方4 小时前
从审计日志到可下载证据包:事务型 Outbox、租约 fencing 与保留水位
前端·后端·架构
卓怡学长4 小时前
w266基于spring boot + vue 圣地延安美食乐享系统
java·数据库·vue.js·spring boot·spring·intellij-idea