分析 Vue3 Effect 函数看响应式依赖收集和触发更新过程

news2024/9/24 2:34:11

先给一个简单的实例,分析依赖收集和更新的过程

let obj = { name: "hefeng6500", age: 10, flag: true }

const state = reactive(obj);

effect(() => {
  app.innerHTML = state.name + state.age
})

setTimeout(() => {
  state.age = 20
}, 1000)

reactive 函数只会创建一个响应式对象,没有产生其他的什么副作用,仅在 state 对象在访问或者修改时才会触发 proxygettersetter

依赖收集

当 effect 函数在执行时

  • Vue 底层会创建一个 ReactiveEffect 实例,创建后调用该实例的 run 方法。run 方法实际就是传入 effect 的回调函数。
  • 在执行 run 方法前,将 activeEffect = this 置为 this,也就是 activeEffect 是当前创建的 ReactiveEffect 实例。接着执行 run 方法
  • 执行 run 方法时,会访问 state.namestate.age,这就会触发两次 proxy 的 getter
  • 每触发一次 getter,就会进行一次依赖收集,也就是 track(target, key)
  • track 执行时会从 targetMap 上获取当前 taget 是否存在,未存在就 targetMap.set(target, (depsMap = new Map())) 接着,在 depsMap 上寻找 key 是否存在不存在就设置 depsMap.set(key, new Map())

在这里插入图片描述

最后 depsMap 保存格式如下:
在这里插入图片描述

  • 执行 track 时,内部调用了 trackEffect,它将刚刚的 activeEffect.deps 数组上添加了 nameage 这两个 dep,并且 这两个 dep 上分别保存了 这个 activeEffect。形成了双向记忆。

在这里插入图片描述

触发更新

当执行 state.age = 20

  • 触发 proxy 的 setter,进而触发 trigger 函数,找出 age 对应的 dep。调用 triggerEffects(dep)
  • triggerEffects 拿到 dep 后将该 dep 上所有的 effect 拿出来,调用它的 scheduler(其实就是 run 方法,也就是 effect 传入的回调函数)

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

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

相关文章

吴恩达:如何系统学习机器学习?

最近在知乎圆桌里看到吴恩达的回答,【如何系统学习机器学习?】颇为惊喜,仿佛看到了知乎刚成立时的样子,请各个行业大佬来分享专业知识。 该回答目前已经有三千多赞,评论区也相当火爆,一片膜拜之声。 吴恩…

java学习19VUE

VUE NPM npm的全称是Node Package Manager 中文名为Node.js包管理器,是一个NodeJS包管理和分发工具,已经成为了非官方的发布Node模块(包)的标准。NPM可以方便地从一个全球的代码库中获取并安装Node.js模块,这些模块可以用于构建应用程序、…

开发框架DevExpress XAF v24.2产品路线图预览——增强跨平台性

DevExpress XAF是一款强大的现代应用程序框架,允许同时开发ASP.NET和WinForms。XAF采用模块化设计,开发人员可以选择内建模块,也可以自行创建,从而以更快的速度和比开发人员当前更强有力的方式创建应用程序。 DevExpress XAF是一…

Python 之Scikit-learn(二) -- Scikit-learn标准化数据

在机器学习中,数据标准化是一项关键的预处理步骤。标准化(Standardization)是将数据转换为具有均值为0和标准差为1的分布。这样可以确保特征在相同的尺度上,有助于提升某些机器学习算法的性能和稳定性。 Scikit-learn提供了一个简…

一篇教会搭建ELK日志分析平台

日志分析的概述 日志分析是运维工程师解决系统故障,发现问题的主要手段日志主要包括系统日志、应用程序日志和安全日志系统运维和开发人员可以通过日志了解服务器软硬件信息、检查配置过程中的错误及错误发生的原因经常分析日志可以了解服务器的负荷,性…

Date类型的字段序列化成JSON字符串

我们发现收到的响应结果里面有一个参数为: 我们收到的时间字符串格式是由JSON序列化框架来决定的。 spring将JAVA数据类型的序列和反序列化为JSON字符串是依赖jackson(com.fasterxml.jackson.core:jackson-core)库来实现的。 Date类型的字段在序列化成JSON字符串时…

【人工智能】人工智能与机器学习的相关介绍

文章目录 人工智能的发展历程人工智能与机器学习关系图谱数据处理机器学习ML和深度学习DL的区别人工智能按照学习方式划分监督学习算法无监督学习算法总结 人工智能的发展历程 重要的时间点了解一下: 早在1950年人工智能就已经开始兴起 1997年deep blue战胜了人类国…

天津美术学院2024级专升本新生开学报道须知

天津美术学院2024级新生入学须知 亲爱的新同学: 祝贺你成为天津美术学院的新成员,开启新的求学历程!为方便新生入学,现将有关事宜通知如下: 一、报到安排 1.报到时间:2024年9月6日上午8:30—…

MYSQL的引擎、清空数据的两种方式

目录 1.MYSQL引擎介绍 1.1MySQL的引擎作用: 1.2 MySQL的3类引擎 1.3 MyISAM和InnoDB的区别 1.4设定引擎 2. 清空数据有两种不同的方式 2.1 区别 1.MYSQL引擎介绍 MySQL有多种引擎,能执行create table、select等命令,在数据量不多时…

二十九、MongoDB(1)

🌻🌻 目录 一、MongoDB简介1.1 什么是 MongoDB1.2 MongoDB特点1.3 MongoDB 体系结构 二、下载与安装2.1 MongoDB下载2.2 在Linux 上的安装2.2.1 安装前的准备2.2.2 开始安装2.2.3 测试软链接启动 2.3 在windows上的安装 三、基本增删改查操作3.1 选择或创…

lvs防火墙mark标记解决调度问题

实验环境是在之前部署DR模式集群的基础上做的,参考如下 部署DR模式集群 以http和https为例,当我们在webserver中同时开放80和443端口,那么默认控制是分开轮询的,就会出现了一个轮询错乱的问题: 当第一次访问80被轮询…

浅谈基础的图算法——Tarjan求强联通分量算法(c++)

文章目录 强联通分量SCC概念例子有向图的DFS树代码例题讲解[POI2008] BLO-Blockade题面翻译题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 思路AC代码 【模板】割点(割顶)题目背景题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 提示…

【论文分享】测量城市夜间活力及其与城市空间结构的关系:一种数据驱动的方法

近年来,夜间活力作为反映城市经济和生活质量的重要指标受到关注。本次我们给大家带来一篇SCI论文的全文翻译。该论文采用了数据驱动的方法来测量夜间活力,并探索了其与城市空间结构的关系。该论文派生的洞见可以帮助制定空间策略,以增强夜间活…

微信小程序 - 自定义底部菜单栏

微信小程序底部菜单栏是可以通过自定义来实现的。主要涉及:新建组件、编写组件代码、设置样式、配置导航栏、在页面中引用。自定义底部导航栏可以创建出符合项目设计需求效果,实现个性化的页面切换功能。 如下图效果,为比较常见的中间突出半圆…

2-58 基于matlab的图像处理 GUI 程序

基于matlab的图像处理 GUI 程序,功能包括裁剪、 旋转和翻转图像。 更改曝光、 对比度和饱和度, 黑白、 灰度等常见处理效果。程序已调通,可直接运行。 2-58 图像处理 GUI 程序 - 小红书 (xiaohongshu.com)

同享人力资源管理系统-TXEHR V15 hdlUploadFile.ashx 文件上传致RCE漏洞复现

0x01 产品简介 同享人力资源管理系统(TXEHR V15)是一款专为现代企业设计的人力资源管理软件解决方案,旨在通过先进的信息化手段提升企业人力资源管理的效率与水平。该系统集成了组织人事、考勤管理、薪资核算、招聘配置、培训发展、绩效管理等核心模块,并提供了灵活的配置…

大数据-41 Redis 类型集合(2) bitmap位操作 geohash空间计算 stream持久化消息队列 Z阶曲线 Base32编码

点一下关注吧!!!非常感谢!!持续更新!!! 目前已经更新到了: HadoopHDFSMapReduceHiveFlumeSqoopZookeeperHBaseRedis (正在更新) 章节内容 上一…

高校实验室预约系统的设计与实现-计算机毕业设计源码58031

摘要 随着信息技术的不断发展,高校实验室资源的管理和利用愈发重要。为了提高实验室资源的利用率和管理效率,我们设计并实现了一款基于Spring Boot框架的高校实验室预约系统。 本系统旨在为学生提供一个便捷、高效的途径来预约实验室资源,并为…

html+css+js网页设计星巴克作业2个页面(带js)

htmlcssjs网页设计 星巴克作业2个页面(带js) 网页作品代码简单,可使用任意HTML编辑软件(如:Dreamweaver、HBuilder、Vscode 、Sublime 、Webstorm、Text 、Notepad 等任意html编辑软件进行运行及修改编辑等操作&#…

Linux系统驱动(九)IO模型---异步通知IO模型

文章目录 一、概念二、异步通知IO模型驱动实现(一)异步通知IO模型实现1. fcntl(fd,F_GETFL)调用流程2. fcntl(fd,F_SETFL,flags|FASYNC)3. fcntl(fd,F_SETOWN,getpid()) (二)驱动层提供异步通知模型1. 驱动层中实现异步通知IO模型…