当前位置:首页 > 技术文章 > 正文内容

Vue 2 响应式系统_vue2.0响应式原理

zonemu5小时前技术文章2

“Vue 2 的响应式是怎么实现的?”

本文用一张流程图 + 四段源码级剖析,带你走完 Observer → Dep → Watcher → Scheduler 的完整链路。

一、为什么需要响应式

在传统命令式框架中,开发者必须手动调用 DOM API 更新视图,逻辑与渲染耦合。Vue 2 的核心目标是数据驱动——当对象或属性变化时,视图自动重绘。实现这一目标的底层机制就是响应式系统。

二、四大核心角色

1.Observer

进入组件生命周期 beforeCreate → created 之间,Vue 会递归遍历 data 中的每个属性,通过 Object.defineProperty 重写 getter/setter:

  • getter:收集依赖(记录谁在读我);
  • setter:派发更新(通知所有依赖我“我变了”)。

动态增删属性无法被劫持,因此需要 vm.$set / vm.$delete 手动触发响应式。

数组则通过重写原型链方法(push、pop、splice 等)实现拦截,确保“数组内容变化”也能被观测。

2.Dep
每个响应式对象的每个属性都会对应一个
Dep 实例。它只做两件事:

  • 记录依赖(谁在读取我);
  • 触发更新(属性变化时通知所有依赖)。

当改变某个属性时,它会派发更新:那些用我的人听好了,我变了。

3.Watcher
当 render 函数执行时,Vue 不会直接运行它,而是交给一个 Watcher。Watcher 的职责:

  • 运行函数前,把自己设为全局变量;
  • 函数执行过程中,任何响应式数据的 getter 都会把当前 Watcher 记录到对应 Dep;
  • 当 Dep 触发更新时,Watcher 重新运行函数(通常是 render)。

每个组件实例至少有一个渲染 Watcher,确保数据变化 → 组件重新渲染。

4.Scheduler
如果同一轮事件循环内多次修改响应式数据,Watcher 会被多次标记为“待更新”。
Scheduler 会把这些 Watcher 放入微任务队列(通过
Promise.then 实现 nextTick),同一个 Watcher 只出现一次,从而避免不必要的重复渲染,实现批量异步更新。

三、整体数据流回顾

  1. 组件初始化 → Observer 劫持属性 → 建立 Dep 与 Watcher 关联
  2. 用户交互触发 setter → Dep 通知 Watcher → Watcher 加入 Scheduler 队列
  3. 微任务阶段统一 flush 队列 → 组件 render 重新执行 → 虚拟 DOM diff → 最小化 DOM 更新

相关文章

Vue状态管理:Pinia完整指南(状态管理vuex)

概述本文专注于Vue的状态管理。我们将深入探讨如何使用Pinia来管理Vue应用程序的状态。状态管理使用props和emit进行父子组件间的数据协作虽然方便,但在以下情况下可能不够充分,数据传递往往会...

程序员开发必会之git常用命令,git配置、拉取、提交、分支管理

整理日常开发过程中经常使用的git命令!git配置SSH刚进入项目开发中,我们首先需要配置git的config、配置SSH方式拉取代码,以后就免输入账号密码了!# 按顺序执行 git config -...

傻瓜式DEVOPS实践手册——Gitlab部署

GitLab是一款开放源代码的DevOps平台,用于实现从项目规划、源代码管理、CI/CD到监控和安全性的全方位集成。GitLab主要用于版本控制、协同开发、持续集成/持续部署 (CI/CD)、自动化...

「云原生」Containerd ctr,crictl 和 nerdctl 命令介绍与实战操作

一、概述作为接替Docker运行时的Containerd在早在Kubernetes1.7时就能直接与Kubelet集成使用,只是大部分时候我们因熟悉Docker,在部署集群时采用了默认的dockers...

简析html5、html的13条区别(html5和html的突出优点)

html5的流行近一两年,在国内主要是移动端和html5游戏的发展,国外也是最近纷纷使用html5,如谷歌,全面的停止flash的广告的投放量,用html5取代之,那么html5较html的区别在哪里...

Vue实战篇|使用路由管理用户权限(动态路由)

权限控制是后台管理系统比较常见的需求,如果我们需要对某些页面的添加权限控制的话,那我们可以在路由管理中的权限做一些校验,没有通过权限校验的给出相应的提示或者直接跳转到报错页面。跟着我一起来学vue实战...