ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

说说vue3 中的响应式设计原理

说说vue3 中的响应式设计原理 Vue 3 的响应式系统是基于 ES6 Proxy 的“依赖追踪 响应式副作用”机制相比 Vue 2 的Object.defineProperty它在能力、性能和开发体验上都是一次彻底重构。下面从设计思想 → 核心实现 → 关键 API → 与 Vue 2 的本质差异​ 系统讲解。一、一句话总览Vue 3 响应式 Proxy拦截对象访问 Reflect保证正确 this Effect副作用收集 Track / Trigger依赖管理二、核心设计思想✅ 响应式不是“数据变 → DOM 变”而是“当数据被访问时记录谁在用它当数据变化时通知所有使用者重新执行。”这就是经典的数据 → 依赖收集 → 副作用 → 触发更新三、最小原型从手写响应式说起1️⃣ 用 Proxy 拦截对象const obj { count: 0 }; const proxy new Proxy(obj, { get(target, key, receiver) { console.log(读取, key); return Reflect.get(target, key, receiver); }, set(target, key, value, receiver) { console.log(修改, key, value); return Reflect.set(target, key, value, receiver); } });✅ Proxy 可以拦截属性读取属性写入in、delete、for...in数组索引、length四、Vue 3 响应式的三大核心1️⃣ ReactiveEffect副作用函数Vue 中所有“用到响应式数据的地方”都会被包装成一个effecteffect(() { console.log(state.count); });effect 是 Vue 组件的渲染函数、computed、watch 的本质effect 执行时会自动收集依赖2️⃣ Track依赖收集当 effect 执行并访问state.countget count ↓ track(state, count) ↓ 将当前 activeEffect 存入 WeakMap内部结构类似WeakMap (target) └── Map (key) └── Set (effect)targetMap └── state ├── count → Set(effect1, effect2) └── name → Set(effect3)✅一个数据 → 多个副作用3️⃣ Trigger触发更新当state.countset count ↓ trigger(state, count) ↓ 找到所有依赖 count 的 effect ↓ 重新执行五、reactive / ref 的实现原理✅ reactiveProxy 包裹对象const state reactive({ count: 0 });内部逻辑简化function reactive(target) { return new Proxy(target, { get(target, key, receiver) { track(target, key); return Reflect.get(target, key, receiver); }, set(target, key, value, receiver) { const result Reflect.set(target, key, value, receiver); trigger(target, key); return result; } }); }✅ 深层响应式嵌套对象自动代理✅ ref基本类型的响应式const count ref(0); count.value;为什么需要.value因为Proxy 无法直接代理原始值// ref 本质 { value: 0 }ref内部其实也是reactive({ value })只是做了语法封装。✅ computed带缓存的 effectconst double computed(() state.count * 2);特点是懒执行​ 的 effect依赖不变 → 不重新计算依赖变化 → 标记为 dirty下次访问再算✅ watcheffect schedulerwatch(count, (newVal, oldVal) {});本质创建一个 effect在 trigger 时执行回调支持 flushpre / post / sync六、Vue 3 响应式的性能优势对比点Vue 2Vue 3实现方式Object.definePropertyProxy数组支持hack 重写方法原生拦截动态属性❌ 需要$set✅ 天然支持初始化成本递归遍历惰性代理Map / Set❌✅✅ Vue 3 只在真正访问时才代理✅ 不需要一次性递归所有属性七、异步更新队列非常关键Vue 3 的更新是异步批量执行​ 的state.count; state.count; state.count;只会触发一次组件更新。原理将 effect 放入微任务队列同一事件循环中多次 trigger 会被合并使用Promise.then或 MessageChannel / queueMicrotask✅ 这正是你前面问过的微任务调度机制八、Vue 2 vs Vue 3 响应式本质对比维度Vue 2Vue 3技术Object.definePropertyProxy是否能检测新增属性❌✅是否能拦截数组索引❌✅是否需要递归初始化✅❌是否支持 Map / Set❌✅依赖收集方式闭包 WatcherWeakMap Set九、一句话总结**Vue 3 响应式是一个基于 Proxy 的“全自动依赖追踪系统”数据访问时自动收集副作用数据变化时自动触发更新并通过异步调度和精确 diff 保证性能最优。**
返回列表