回顾

如果有感兴趣的同学可以看看我之前的源码分析文章,这里呈上链接:《Vue源码分析系列:目录》

写在前面

这一篇我们先不着急阅读源码,因为接下来需要用到一个比较复杂的设计模式:观察者模式,而且还需要理解依赖收集派发更新才能继续向下阅读源码,所以这次我们先做一个铺垫。

依赖收集

通过之前阅读的源码我们了解到Vue2.x版本的响应式是依靠Object.defineProperty这个API来进行对象的劫持,当对象进行取值和赋值操作的时候,都可以进行一些另外的操作。在get过程中,也就是对象的取值,Vue做的操作是:依赖收集。
那么什么是依赖?
这里我们举一个例子:

<template><div class="demo">{{message}}</div>
</template><script>
export default {name:"demo",data:() => ({message:"hello"})
}
</script>

在Vue的1.x版本中,对于依赖的定义分的很细,包括了模板元素上的{{message}}和组件demo;而在2.x的版本中,以上面这个例子为例,data中的messagedemo组件依赖了。

在对data进行响应式构造的时候,需要使用依赖收集器将所有data的依赖收集起来。
在Vue中的依赖收集器的具体表现形式就是Dep类。

所以在data改变过程中,依赖收集器会通知这些依赖于data的项去触发更新。

class Dep

Dep类的具体作用是在数据的get过程中,收集数据的相关依赖项,用于之后的更新依赖操作。

其实在数据和依赖的中间还夹着一层,就是订阅者,订阅者的作用就是在数据的set过程中触发订阅者的通知方法,从而让订阅者去通知依赖更新。

所以,Dep实例的不会直接存放依赖项,Dep实例存放的其实是各个依赖项对应的watcher实例,由watcher实例去调用对应依赖项的更新。

在Vue中,订阅者的具体表现形式就是Watcher类。

class Watcher

Watcher是一个观察者类。
Watcher也会存储Dep,因为一个依赖项可能会依赖多个被依赖项,如一个Computed可能会使用到多个data。当其中任意一个被依赖项发生改变时,Watcher就会去通知相关依赖项的更新。
watcher类的通知依靠的是update方法,这个update方法就是主动去触发依赖的更新。那么这个update方法是怎么触发的呢?
在数据发生变化时,会调用Dep实例的notify方法,这个notify方法会去在自身实例上寻找依赖列表,这个依赖列表里面都是一个个的watcher,之后notify方法会遍历这个列表,逐个触发watcherupdate方法。

也就是说,真正的数据更新顺序是这样的:
配置data的响应式 -------> 实例化对应依赖的watcher -------> 触发get -------> 由Dep去收集相关的watcher ------->watcher收集当前的Dep -------> 页面交互 -------> 触发set -------> Dep通知watcher更新 -------> watcher更新依赖项。

官方的流程图

官方的图这里在datawatcher中间少了一个Dep,其实图中的NotifyCollect as Despendency都是由Dep实例做的。(可能是为了便于理解吧,故意省略了Dep类)

总结

Vue响应式原理的难点其实就在于DepWatcher
Dep存储了多个WatcherWatcher又会存储多个Dep,是一个复杂的多对多的关系,这个在之后介绍computed原理时会体现得更加明显。
理解了DepWatcher类的关系,对我们接下来阅读源码有非常大的帮助。

Vue源码解析系列——响应式原理篇:理解Dep类和Watcher类相关推荐

  1. Vue源码解析系列——数据驱动篇:patch的执行过程

    准备 vue版本号2.6.12,为方便分析,选择了runtime+compiler版本. 回顾 如果有感兴趣的同学可以看看我之前的源码分析文章,这里呈上链接:<Vue源码分析系列:目录> ...

  2. data access components 2.0未响应_Vue2.x 源码剖析之响应式原理

    # Study Notes 本博主会持续更新各种前端的技术,如果各位道友喜欢,可以关注.收藏.点赞下本博主的文章. Vue.js 源码剖析-响应式原理 响应式处理的入口 src/core/insta ...

  3. vue源码之视图响应式更新

  4. prometheus变量_TiKV 源码解析系列文章(四)Prometheus(下)

    本文为 TiKV 源码解析系列的第四篇,接上篇继续为大家介绍 rust-prometheus.上篇主要介绍了基础知识以及最基本的几个指标的内部工作机制,本篇会进一步介绍更多高级功能的实现原理. 与上篇 ...

  5. Vue源码解析(尚硅谷)

    视频地址:Vue源码解析系列课程 一.Vue源码解析之mustache模板引擎 1. 什么是模板引擎 模板引擎是将数据要变为视图最优雅的解决方案 历史上曾经出现的数据变为视图的方法 2. mustac ...

  6. Vue源码解析之数组变异

    力有不逮的对象 众所周知,在 Vue 中,直接修改对象属性的值无法触发响应式.当你直接修改了对象属性的值,你会发现,只有数据改了,但是页面内容并没有改变. 这是什么原因? 原因在于: Vue 的响应式 ...

  7. vue 计算属性_lt;Vue 源码笔记系列6gt;计算属性 computed 的实现

    1. 前言 原文发布在语雀: <Vue 源码笔记系列6>计算属性 computed 的实现 · 语雀​www.yuque.com 上一章我们已经学习过 watch,这一章就来看一下计算属性 ...

  8. openGauss数据库源码解析系列文章--openGauss简介(一)

    openGauss数据库是华为深度融合在数据库领域多年经验,结合企业级场景要求推出的新一代企业级开源数据库.此前,Gauss松鼠会已经发布了openGauss数据库核心技术系列文章,介绍了openGa ...

  9. Vue源码解析(一)

    前言:接触vue已经有一段时间了,前面也写了几篇关于vue全家桶的内容,感兴趣的小伙伴可以去看看,刚接触的时候就想去膜拜一下源码~可每次鼓起勇气去看vue源码的时候,当看到几万行代码的时候就直接望而却 ...

  10. TiKV 源码解析系列文章(二)raft-rs proposal 示例情景分析

    作者:屈鹏 本文为 TiKV 源码解析系列的第二篇,按照计划首先将为大家介绍 TiKV 依赖的周边库 raft-rs .raft-rs 是 Raft 算法的 Rust 语言实现.Raft 是分布式领域 ...

最新文章

  1. Linux 0.12内核与现代内核在内存管理上的区别
  2. MFC版本链表演示程序
  3. 苏宁高时效、高并发秒杀业务中台的设计与实现
  4. Javascript简单教程汇总
  5. SpringBoot快速入门——helloworld(来自官网)
  6. Android中的ClassLoader与dex文件加密实现分析
  7. weex 安装过程中遇到的坑
  8. 百度SEO Typecho仿Win95怀旧主题
  9. VS2013 community卸载后不能重装的问题
  10. 进程之间信号收发并携带数据
  11. Codeforces 583 DIV2 Robot's Task 贪心
  12. Better-scroll的安装及使用
  13. 搭建本地LNMP开发环境(6)-配置nginx和PHP
  14. debian如何安装wifi驱动_装机人员是如何离线为Win7、Win10、XP安装驱动的?小编告诉你…...
  15. 酒精传感器实验-传感器原理及应用实验
  16. numpy安装与调试
  17. c语言10迷宫,C语言实现走迷宫
  18. 十大工业设计公司是如何排名的?
  19. [Springboot]发送邮件、重置密码业务实战
  20. 揭秘青提WiFi分销小程序到底有多赚钱?商家的宝贝代理的吸金利器

热门文章

  1. keytool条目_keytool常用命令
  2. PGP加密并签名电子邮件
  3. HUAWEI HiCar让华为手机用户中的宝马车主Hi起来!
  4. 互联网从此没有 BAT
  5. CrossApp 0.4.2 发布,隆重推出 WebView
  6. Appium环境搭建超详细教程
  7. jquery html包含自身,jquery 获取 outerHtml 包含当前节点本身的代码
  8. cbnertvirtual内部框架下载_关于matepad pro谷歌框架
  9. 计算机接口论文摘要,计算机接口技术论文
  10. 计算机并口地址定义,电脑并口(LPT)引脚定义