news 2026/5/11 5:01:28

Vue响应式原理

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Vue响应式原理

Vue响应式原理

  • 数据劫持:vue2的Object.defineProperty(对属性添加getter和setter方法),vue3的Proxy。
  • 依赖收集:模板渲染时收集,computed收集,watch收集。
  • 依赖执行:将收集到的依赖依次执行。
    依赖其实就是数据变化时要执行的函数。

依赖收集

Vue 响应式依赖收集的核心是收集数据变化时需要重新执行的代码,具体包括:

  • 组件模板渲染的「更新函数」(最核心);
  • 计算属性的「求值函数」;
  • watch/watcher 的用户自定义的「回调函数」;
  • 手动通过 watchEffect/ReactiveEffect 等 API 定义的「自定义函数」。

依赖收集的本质是「响应式数据与执行函数的映射」,数据变化时通过映射关系精准触发函数执行,这也是 Vue 实现「数据驱动视图」的核心原理。

源码解析

vue2是通过Dep类收集(watcher),Dep类维护一个watcher数组,数据变化时通知watcher更新。
vue3是通过effect函数收集。get时调用track收集依赖,set时调用trigger触发所有的effect更新。

vue2通过watcher类收集依赖

  • 渲染watcher
    每个组件在挂载时都会创建一个渲染watcher,负责渲染视图时的依赖收集。
newWatcher(vm,updateComponent,noop,watcherOptions,true)/* isRenderWatcher */
  • 计算属性(缓存)
    每一个计算属性内部维护一个dirty属性,表示是否需要重新计算。
    当取值时dirty为true就会执行计算函数计算值,拿到值缓存起来this.value, 并将dirty设置为false。
    再次取值时,dirty为false就直接返回缓存的值this.value。
    当计算属性依赖的数据变化时,会将dirty设置为true,下次访问计算属性时会重新计算值。

  • 计算属性watcher(lazy:true)

newWatcher(vm,getter,noop,{lazy:true})

计算属性会创建一个计算属性watcher,lazy:true表示懒执行。不会立即执行计算函数。
通过Object.defineProperty给计算属性添加getter和setter方法。
当访问计算属性时会调用getter方法,拿到计算属性watcher,看看dirty属性是否为true,如果是true就执行计算函数计算值,并将dirty设置为false。
同时让计算属性watcher中依赖的属性收集最外层的渲染watcher,这样当计算属性依赖的数据变化时会通知渲染watcher更新视图。

  • 用户watch定义时的watcher
newWatcher(vm,expOrFn,cb,options)//cb是用户定义的回调函数。

用户通过watch选项或者$watch方法创建的watcher。

vue3通过effect函数收集依赖

  • 渲染effect:
consteffect=(instance.effect=newReactiveEffect(componentUpdateFn))
  • 计算属性effect
consteffect=newReactiveEffect(getter,()=>{if(!dirty){dirty=true// 计算属性依赖的属性变化时,通知计算属性收集的渲染effect更新triggerRefValue(computedRefImpl)}})

和vue2不一样的是,这个计算属性会收集当前组件渲染的effect作为它的依赖。不需要普通属性自己去收集渲染watcher。
计算属性依赖的属性变化时,会通知计算属性effect更新dirty, 并且计算属性会触发自己收集的渲染effect执行。

  • 用户watch effect
consteffect=newReactiveEffect(getter,()=>{// 当数据变化时执行回调job()})
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/7 20:33:51

Docker Compose Agent配置没人说的秘密:4种性能优化方案曝光

第一章:Docker Compose Agent配置的现状与挑战在现代容器化应用部署中,Docker Compose 作为定义和运行多容器应用的重要工具,广泛用于开发、测试及轻量级生产环境。然而,随着服务规模的增长和部署复杂度的提升,基于 Do…

作者头像 李华
网站建设 2026/5/2 21:19:40

手机拍照片的开挂功能:AI魔法表情,一键就能拯救废片啦!

你是否有过这样的经历?旅行打卡时被阳光晃得眼睛睁不开,朋友聚会合照有人闭眼或表情不佳,小朋友开心的笑容没来得及定格……许多精彩的摄影场景,一张张本该完美的照片因“表情翻车”就此留下遗憾。不用慌,华为手机里图…

作者头像 李华
网站建设 2026/5/9 9:14:12

Meta Llama模型访问权限申请与使用指南

Meta Llama模型访问权限申请与使用指南 【免费下载链接】llama Inference code for LLaMA models 项目地址: https://gitcode.com/gh_mirrors/ll/llama Meta Llama系列大语言模型作为业界领先的开源AI解决方案,其强大的文本生成和推理能力吸引了全球开发者的…

作者头像 李华
网站建设 2026/5/10 13:35:05

未来 AIDC 基础设施规范沙龙成功举办

GCC-Open AI Infra社区成立一个月以来,机房基础设施、AI整机柜在内的4个项目群正有序运行。到目前为止,基础设施项目群已经启动了机房液冷、机房供配电、DC智能化等项目;AI整机柜规项目组已经启动了供电、散热、高速互联等项目;板…

作者头像 李华
网站建设 2026/5/5 10:58:52

从EtherNet/IP到DeviceNet:一场驱动智能仓储升级的“协议融合”实践

从EtherNet/IP到DeviceNet:一场驱动智能仓储升级的“协议融合”实践1. 项目背景:智能仓储升级的异构网络之困近年来,国内某大型电商区域配送中心面临仓储自动化升级需求。现场控制系统核心为三套罗克韦尔ControlLogix系列PLC(采用…

作者头像 李华