vue源码阅读之Watcher类

news2024/11/17 0:01:15

我们上次分析vue源码讲的是收集依赖,数据变化之后我们把依赖收集到dep类中,通过这个管理器进行管理。

里面有一个subs数组,用来存放依赖,并且定义了几个实例方法用来依赖进行添加,删除,通过操作。

比如addSub,removeSub,depend、notify等方法。

依赖到底是谁

我们dep是用来管理依赖的,那么要添加的依赖到底是谁?

其实这个依赖就是我们常说的watcher的类,也就是说谁用了数据,谁就是那个依赖。

谁用到了数据,我们就为谁创建一个Watcher实例。在之后数据变化的时候,我们不去直接通知依赖更新,而是通知依赖对应的Watch实例,由Watcher实例去通知真正的视图。

export default class Watcher implements DepTarget {
}

这个就是Watcher类,实现了DepTarget。
而DepTarget这个接口在dep类里面实现的。

export interface DepTarget extends DebuggerOptions {
  id: number
  addDep(dep: Dep): void
  update(): void
}

Wathcer构造函数

下面是Watcher构造函数的源码。

constructor(
    vm: Component | null,
    expOrFn: string | (() => any),
    cb: Function,
    options?: WatcherOptions | null,
    isRenderWatcher?: boolean
  ) {
    // 初始化代码
    // 此处省略部分代码...
    this.value = this.lazy ? undefined : this.get()
  }

这个就是在创建Watcher实例的时候初始执行的部分。在创建Watcher实例的时候会自动把自己添加到这个数据的依赖管理器中。

在最后一行有个this.value,执行了this.get();

这个get函数源码如下

 get() {
    pushTarget(this)
    let value
    const vm = this.vm
    try {
      value = this.getter.call(vm, vm)
    } catch (e: any) {
      if (this.user) {
        handleError(e, vm, `getter for watcher "${this.expression}"`)
      } else {
        throw e
      }
    } finally {
      // "touch" every property so they are all tracked as
      // dependencies for deep watching
      if (this.deep) {
        traverse(value)
      }
      popTarget()
      this.cleanupDeps()
    }
    return value
  }

这里get函数第一步就是把这个watcher实例给了Dep.target。

然后在通过this.getter.call(vm, vm)获取一下被依赖的数据,这里的getter就是

更新组件重新传染函数updateComponent。

当数据发生变化的时候,会触发set函数,set函数接着会触发dep.nofity函数。然后执行Watcher类中的update()方法,调用数据变化的更新回调函数,从而更新视图。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/707553.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

mysql基础5——mysql主从

文章目录 一、基本了解二、主从原理三、主从复制3.1 从无到有3.1.1 服务器初始化3.1.2 配置主库3.1.3 配置从库3.1.4 效果验证 3.2 从有到无3.2.1 主库全备,并同步到从库3.2.2 配置主库3.2.3 配置从库3.2.4 效果验证 四、数据库运维4.1 几个参数4.2 查看进程列表 一…

【案例实战】高并发业务的多级缓存架构一致性解决方案

我们在高并发的项目中基本上都离不开缓存,那么既然引入缓存,那就会有一个缓存与数据库数据一致性的问题。 首先,我们先来看看高并发项目里面Redis常见的三种缓存读写模式。 Cache Aside 读写分离模式,是最常见的Redis缓存模式&a…

树莓派教程2023

摘要:本教程只适用于最新版树莓派64位系统(debian11) 树莓派官网(之前是org): https://www.raspberrypi.com/ 一.烧录系统 1.官网下载官方烧写器 https://downloads.raspberrypi.org/imager/imager_late…

部署Redis到云服务器

购买某服务商的云服务器 在云服务器中设置TCP端口号 配置云服务器的开放端口 通过telneat测试端口是否可用 配置redis服务器 需要配置一下自己云服务器的ip 保护模式关闭、允许其他远端连接 设置和云服务器开放一致的端口号 打开此项设置redis的连接密码,更加…

一、计算复杂度

补充说明: 1、决定性问题: 一个决定性问题(decision problem)是指其输出,只有“是”或“否”的问题。 一、P问题(polynomial time class) 1、问题描述: 可于确定型图灵机以多项式时间求解的决定性问题…

STM32学习之keil5环境搭建

1.keil5是开发ARM内核芯片最常用的集成开发环境IDE。STM32开发环境的搭建主要分为两步: 第一步,安装Kile5.到keil官网下载:Keil Embedded Development Tools for Arm, Cortex-M, Cortex-R4, 8051, C166, and 251 processor families. 第二步…

“SRP模型+”多技术融合在生态环境脆弱性评价模型构建、时空格局演变分析与RSEI指数的生态质量评价及拓展应用

第一章 生态环境脆弱性评价内涵及基于文献可视化方法研究热点分析 一、基本原理 生态环境脆弱性内涵 生态环境脆弱性评价研究 生态环境脆弱性驱动力研究 生态环境脆弱性研究热点 二、文献可视化软件介绍及常用功能介绍 VOS Viewer文献可视化及研究热点分析&#xff…

工业物联网时代需要什么样的数据采集设备

引言: 随着物联网技术的飞速发展,数据成为推动企业决策和创新的核心资源。然而,要实现高效的数据收集和分析,需要可靠的数据采集设备。本文将探讨物联网时代对数据采集设备的需求,并介绍一款优秀的工业边缘网关产品——…

软考A计划-系统集成项目管理工程师-项目范围管理(三)

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列 👉关于作者 专注于Android/Unity和各种游戏开发技巧&#xff…

DevOps系列文章之 DevOps 运维服务体系

DevOps 体系是从原始运维一步步走过来的,原始运维好比是本,有了本进而想继续提升效率、减少出错、优化流程,就发展到了 DevOps,AIOps……各种Ops 首先,运维的业务职能规范后形成章程、纲领,在互联网快速发…

flutter手写一个底部导航栏

使用了一下flutter提供的导航栏,NavigationBar,不过感觉使用起来不是很方便。 譬如说: 不能直接使用图片资源,需要中间加几层转换把图片转化成icon文本大小及颜色不太好控制状态栏的上边来一个横线也没有相应的样式,等…

对 tcp out-of-window 的安全建议

TCP 收到一个 out of window 报文后会立即回复一个 ack,这是 RFC793 中 SEGMENT ARRIVES 段的要求。但这是为什么?难道不是默默丢弃才对吗? 对 oow 报文回复 ack,岂不是把正确的 ack 号回过去了吗,这样攻击者盲打一番…

设计模式篇---建造者模式

文章目录 概念结构实例总结 概念 建造者模式的定义:将一个复杂对象的构建与它的表示分离,使得同样的构造过程可以创建不同的表示。 这么看起来有点难以理解,翻译一下就是 用户无需关注创建复杂对象的过程,只需要指定创建的对象即…

一文带你了解云HIS

一、简介 基于云计算技术的B/S架构的HIS系统,为基层医院机构提供标准化的、信息化的、可共享的医疗信息管理系统,实现医患事务管理和临床诊疗管理等标准管理信息系统的功能。系统利用健康云计算平台的技术优势,建立统一的健康档案存储平台&am…

spark调试中常见的错误集锦

示例一、没有引入jar错误 错误描述: 以spark在pyspark环境解析xml为例 spark核心包不支持解析xml,所以需要引入引用依赖包配置为: config("spark.jars.packages", "com.databricks:spark-xml_2.12:0.16.0") 在spark-submit部署提交…

ctfshow_反序化漏洞

web254 首先进行一个代码审计 <?php error_reporting(0); highlight_file(__FILE__); include(flag.php);class ctfShowUser{public $usernamexxxxxx;public $passwordxxxxxx;public $isVipfalse;public function checkVip(){return $this->isVip;}public function logi…

Converting Phase Noise to Random Jitter(Period)

推导了Phase Noise to Random Jitter(Period)的转换过程&#xff0c;解释了分频对Phase Noise & Spur(每2分频改善6dB)的影响&#xff0c;每N分频&#xff0c;TIE RJ(1&#x1d70e;)不变(之前已推导)&#xff0c;而Period RJ(1&#x1d70e;)增加√N倍。

RecyclerView 实现WheelView和省市区多级联动

作者&#xff1a;丨小夕 前言 滚轮经常在选择中用到&#xff0c;主要包括类型选择、省市区联动选择、年月日联动选择等。 项目中的WheelView一般都是ScrollViewLinearLayout组合完成的。 但是自定义起来比较复杂&#xff0c;也有一些优秀的第三方库DateSelecter 通过Adapter…

直线导轨的技术应用

直线导轨是机械领域中使用广泛的一种构件&#xff0c;主要用于机器的移动和定位。它具有高精度、高刚性和耐磨损等优点&#xff0c;被广泛应用于工业制造、医疗设备、半导体设备等领域。现在&#xff0c;我们来详细了解一下直线导轨的技术应用。 1、移动装置&#xff0c;直线导…

二、Spring Cloud Eureka 简介、快速入门

注册发现中心 Eureka 来源于古希腊词汇&#xff0c;意为“发现了”。在软件领域&#xff0c; Eureka 是 Netflix 在线影片公司开源的一个服务注册与发现的组件&#xff0c;和其他 Netflix 公司的服务组件&#xff08;例如负载均衡、熔断器、网关等&#xff09; 一起&#xff0…