当前位置: 首页 > news >正文

Vue3 响应式系统——ref 和 reactive

一、Vue3 响应式系统概述

Vue3 响应式包 @vue/reactivity,核心由三部分构成:

数据 (Proxy Object)  —— 依赖收集 Track  —— 触发更新 Trigger  ——  Effect 执行更新

核心目标:

  • 拦截读取和设置操作
  • 收集依赖
  • 在数据变化时重新触发相关副作用

主要实现 API:

二、reactive() 执行机制

2.1 核心逻辑(核心源码)

function reactive(target) {return createReactiveObject(target, false, mutableHandlers)
}function createReactiveObject(target, isReadonly, baseHandlers) {if (!isObject(target)) {return target}if (target already has proxy) return existing proxyconst proxy = new Proxy(target, baseHandlers)cache proxyreturn proxy
}

Vue3 用 ​Proxy 拦截对象操作​,比 Vue2 的 Object.defineProperty 更强(能监听属性增删)。

2.2 reactive 的 handler(简化)

const mutableHandlers = {get(target, key, receiver) {const res = Reflect.get(target, key, receiver)track(target, key)return isObject(res) ? reactive(res) : res},set(target, key, value, receiver) {const oldValue = target[key]const result = Reflect.set(target, key, value, receiver)if (oldValue !== value) {trigger(target, key)}return result}
}

三、依赖收集和触发更新:track()trigger()

Vue 内部维护一个 ​全局的 activeEffect​:

let activeEffect = nullfunction effect(fn) {activeEffect = wrappedEffect(fn)fn() // 执行一次用于收集依赖activeEffect = null
}

每次读取(get)响应式数据时:

function track(target, key) {if (!activeEffect) returnconst depsMap = targetMap.get(target) || new Map()const dep = depsMap.get(key) || new Set()dep.add(activeEffect)
}

当数据被设置(set)时:

function trigger(target, key) {const depsMap = targetMap.get(target)const dep = depsMap?.get(key)dep?.forEach(effect => effect())
}
  • track 只在 读取时收集依赖
  • trigger 只在 数据修改时触发 effect 重新执行

四、ref() 的设计与区别

4.1 ref 是什么?

ref() 主要用于包装 基本类型 (对于对象引用类型内部直接调用上面的 reactive()):

const count = ref(0)

其结构本质上是:

interface RefImpl {value: T
}

源码核心:

function ref(rawValue) {return createRef(rawValue)
}function createRef(rawValue) {const refImpl = { _value: convert(rawValue), dep: new Set(), // 区别于reactive引用类型复杂的多层嵌套数据结构封装dep,ref这里直接在实例中存放一个dep来实现get value() {trackRefValue(refImpl)return refImpl._value},set value(newVal) {if (hasChanged(newVal, refImpl._value)) {refImpl._value = convert(newVal)triggerRefValue(refImpl)}}}return refImpl
}

4.2 ref vs reactive 的本质区别

五、template / setup 中的自动 unwrap

在 Vue 模板中:

<p>{{ count }}</p>

如果 count 是一个 ref,它会 ​自动解包​,模板中不需要写 .value。这是由编译阶段的 transform 实现的。

六、响应式系统执行流程图(简化)

reactive/ref 数据 -> Proxy getter -> track│effect 注册│数据 setter -> trigger↓重新执行 effect
http://www.jsqmd.com/news/263037/

相关文章:

  • 使用 perf + FlameGraph 生成火焰图(Flame Graph)笔记
  • 深度测评10个AI论文写作软件,研究生高效写作必备!
  • 基于深度学习和熔池图像对的焊缝熔透状态识别【附代码】
  • 导入自己的听歌时长数据,统计每周听歌总时长,输出音乐风格偏好分析。
  • python基于Web技术的智能养老管理系统
  • python基于大数据文化产业发展智能分析系统
  • MySQL面试中,锁机制必问的5大问题!
  • Questions for the Technical Advisory Board - 2
  • 前馈/反馈控制是什么
  • 2025年市面上有实力的尘埃粒子计数器源头厂家排行榜,在线式粒子计数器/尘埃粒子检测仪供应厂家电话 - 品牌推荐师
  • 2025年市场技术好的楼板搭建公司推荐,现浇楼梯/楼板现浇/钢筋混凝土现浇/现浇搭建/楼梯现浇,楼板搭建报价口碑推荐 - 品牌推荐师
  • 小程序 智能ai技术的基于Spring Boot的宠物(狗)健康管理的设计与实现
  • 全网最全自考必看!10款AI论文工具测评TOP10
  • 【开题答辩全过程】以 基于微信小程序健康跑平台的设计与实现为例,包含答辩的问题和答案
  • python网络招聘信息分析系统的设计与实现 boss直聘 爬虫 技术的猎聘数据可视化分析
  • 【开题答辩全过程】以 基于Android的高校员工考勤系统的设计与实现为例,包含答辩的问题和答案
  • SKF轴承动力学仿真信号分析代码功能说明
  • URL地址末尾加不加”/“有什么区别
  • 珲春好吃的烤肉哪家好吃
  • AI数据报告产品在文旅景区运营中的实践与技术搭建
  • 四边形不等式相关
  • 【小程序毕设全套源码+文档】基于微信小程序的学生定位考勤系统设计与实现(丰富项目+远程调试+讲解+定制)
  • 【小程序毕设源码分享】基于springboot+微信小程序的面向小学生的阅读交流系统的设计与实现(程序+文档+代码讲解+一条龙定制)
  • 2026 年水质检测仪采购清单:手持式、台式、固定式设备品牌全解析 - 品牌推荐大师1
  • 【小程序毕设源码分享】基于springboot+微信小程序的上门做菜预定服务平台的设计与实现(程序+文档+代码讲解+一条龙定制)
  • 西门子S7-200smart PLC用RS485通讯读取绝对值伺服编码器当前位置程序,并将当前...
  • 汽车制造行业OA系统如何优化百度UE的跨平台截屏功能?
  • 2026工业展好评榜:哪些展会成为行业焦点?智能/机械/机床/传感器/仪器仪表/机器人/液压气动,工业展展会排行榜 - 品牌推荐师
  • 如何在 Linux 中使用 sort 命令排序 ?
  • 半监督深度学习网络在医疗图像处理中的研究