0

0

Vue的响应式系统是如何追踪依赖的?

冰火之心

冰火之心

发布时间:2025-06-12 11:15:01

|

1063人浏览过

|

来源于php中文网

原创

vue 的响应式系统通过依赖追踪实现自动更新视图。1. 数据劫持:vue 2 使用 object.defineproperty,vue 3 使用 proxy,使数据在被访问或修改时可被观测;2. 依赖收集:当数据被读取时,如在模板中使用 {{ message }},当前 watcher 会被记录到该数据的依赖列表中;3. 派发更新:数据变化时触发 setter 或 proxy 的 set,通知所有依赖的 watcher 异步批量更新。此外,数组需用变异方法更新,新增属性需用 vue.set,深层响应则通过递归实现。掌握这三步机制,便能理解 vue 响应式系统的核心原理。

Vue的响应式系统是如何追踪依赖的?

Vue 的响应式系统之所以能自动更新视图,关键就在于它能够追踪依赖。简单来说,当数据变化时,Vue 能知道哪些组件或计算属性需要重新渲染,这背后靠的就是依赖追踪机制。

那它是怎么做到的呢?我们来分几个角度看看。


数据劫持:让数据“可观测”

Vue 2 和 Vue 3 在实现上略有不同,但核心思想是一样的:对数据进行劫持,使其在被访问或修改时可以触发一些行为

立即学习前端免费学习笔记(深入)”;

  • 在 Vue 2 中,使用的是 Object.defineProperty 来监听对象属性的变化。
  • 在 Vue 3 中,使用了更现代的 Proxy,可以监听整个对象的操作,而不仅仅是某个属性。

一旦数据被访问(比如模板里用了 {{ message }}),Vue 就会记录下这个“谁”用到了这个数据,也就是建立一个依赖关系。


依赖收集:谁用了我?

依赖收集的过程其实就是在读取数据的时候,把当前正在执行的 watcher(观察者)记录下来。

举个例子:

JTBC网站内容管理系统5.0.3.1
JTBC网站内容管理系统5.0.3.1

JTBC CMS(5.0) 是一款基于PHP和MySQL的内容管理系统原生全栈开发框架,开源协议为AGPLv3,没有任何附加条款。系统可以通过命令行一键安装,源码方面不基于任何第三方框架,不使用任何脚手架,仅依赖一些常见的第三方类库如图表组件等,您只需要了解最基本的前端知识就能很敏捷的进行二次开发,同时我们对于常见的前端功能做了Web Component方式的封装,即便是您仅了解HTML/CSS也

下载
data() {
  return {
    message: 'Hello Vue'
  }
}

组件渲染时,它会访问 message,这时候 Vue 就知道:“哦,这个组件用到了 message”,于是把这个组件对应的 watcher 加入到 message 的依赖列表中。

你可以把它想象成这样:

  • 每个数据都有一个“小本本”,上面记着谁用过我。
  • 当数据变了,就告诉这些“用过我的人”:“我变了,你该更新了。”

派发更新:数据变了,通知订阅者

当你修改了响应式数据,比如:

this.message = 'New Message'

这时候 Vue 会触发数据的 setter(或者 Proxy 的 set 拦截),然后去遍历之前收集到的依赖,一个个通知它们更新。

这个过程就是“派发更新”。

注意几点:

  • 更新不是立即执行的,而是异步批量处理的,这样可以避免频繁重渲染。
  • 计算属性、watch、组件模板里的变量都会形成不同的 watcher,并各自管理自己的依赖。

一些容易忽略的细节

  • 数组的响应式处理有点特殊:Vue 不能直接通过索引修改数组元素来触发更新,必须使用变异方法(如 pushsplice)或用 Vue.set
  • 新增属性不会自动响应:如果对象一开始没有定义某个属性,后面再加进去,是不会被追踪的。可以用 Vue.setthis.$set 解决。
  • 深层响应是递归完成的:如果你的数据嵌套很深,Vue 会在初始化时递归地把所有子属性也变成响应式的。

基本上就这些。理解依赖追踪的核心逻辑后,你会发现 Vue 的响应式系统虽然强大,但并不神秘。只要记住三点:数据劫持 → 依赖收集 → 派发更新,就能掌握它的运作方式。

相关专题

更多
高德地图升级方法汇总
高德地图升级方法汇总

本专题整合了高德地图升级相关教程,阅读专题下面的文章了解更多详细内容。

4

2026.01.16

全民K歌得高分教程大全
全民K歌得高分教程大全

本专题整合了全民K歌得高分技巧汇总,阅读专题下面的文章了解更多详细内容。

3

2026.01.16

C++ 单元测试与代码质量保障
C++ 单元测试与代码质量保障

本专题系统讲解 C++ 在单元测试与代码质量保障方面的实战方法,包括测试驱动开发理念、Google Test/Google Mock 的使用、测试用例设计、边界条件验证、持续集成中的自动化测试流程,以及常见代码质量问题的发现与修复。通过工程化示例,帮助开发者建立 可测试、可维护、高质量的 C++ 项目体系。

10

2026.01.16

java数据库连接教程大全
java数据库连接教程大全

本专题整合了java数据库连接相关教程,阅读专题下面的文章了解更多详细内容。

33

2026.01.15

Java音频处理教程汇总
Java音频处理教程汇总

本专题整合了java音频处理教程大全,阅读专题下面的文章了解更多详细内容。

15

2026.01.15

windows查看wifi密码教程大全
windows查看wifi密码教程大全

本专题整合了windows查看wifi密码教程大全,阅读专题下面的文章了解更多详细内容。

42

2026.01.15

浏览器缓存清理方法汇总
浏览器缓存清理方法汇总

本专题整合了浏览器缓存清理教程汇总,阅读专题下面的文章了解更多详细内容。

7

2026.01.15

ps图片相关教程汇总
ps图片相关教程汇总

本专题整合了ps图片设置相关教程合集,阅读专题下面的文章了解更多详细内容。

9

2026.01.15

ppt一键生成相关合集
ppt一键生成相关合集

本专题整合了ppt一键生成相关教程汇总,阅读专题下面的的文章了解更多详细内容。

6

2026.01.15

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Vue 教程
Vue 教程

共42课时 | 6.6万人学习

Vue3.x 工具篇--十天技能课堂
Vue3.x 工具篇--十天技能课堂

共26课时 | 1.4万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号