解读vue3源码(3)——watch
Vue3的watch底层源码主要是通过使用Proxy对象来实现的。在Vue3中,每个组件实例都会有一个watcher实例,用于监听组件数据的变化。当组件数据发生变化时,watcher实例会触发回调函数,从而更新组件的视图。
Vue3的watch底层源码主要涉及到以下几个部分:
- 创建watcher对象
- 收集依赖
- 触发更新
下面对这三个部分进行详细解读。
- 创建watcher对象
在Vue3中,watcher对象是通过watchEffect函数创建的。watchEffect函数接收一个函数作为参数,这个函数就是我们要监听的响应式数据的getter函数。watchEffect函数会在创建watcher对象时立即执行这个函数,并收集响应式数据的依赖。
创建watcher对象的源码如下:
function watchEffect(effect, options) {const watcher = new ReactiveEffect(effect, options)watcher.run()return () => {watcher.stop()}
}
其中,ReactiveEffect是一个类,用来创建watcher对象。run方法会执行传入的函数,并收集依赖。stop方法会停止watcher对象的执行。
- 收集依赖
在Vue3中,依赖收集是通过track函数实现的。track函数接收两个参数:响应式数据对象和属性名。它会在getter函数执行时,将当前的watcher对象收集到响应式数据对象的依赖列表中。
track函数的源码如下:
function track(target, key) {if (activeEffect === undefined) {return}let depsMap = targetMap.get(target)if (!depsMap) {targetMap.set(target, (depsMap = new Map()))}let dep = depsMap.get(key)if (!dep) {depsMap.set(key, (dep = new Set()))}if (!dep.has(activeEffect)) {dep.add(activeEffect)activeEffect.deps.push(dep)}
}
其中,targetMap是一个全局的Map对象,用来存储所有响应式数据对象的依赖关系。activeEffect是一个全局的watcher对象,表示当前正在执行的watcher对象。
- 触发更新
在Vue3中,更新是通过trigger函数实现的。trigger函数接收两个参数:响应式数据对象和属性名。它会在setter函数执行时,遍历响应式数据对象的依赖列表,依次执行每个watcher对象的run方法,从而触发更新。
trigger函数的源码如下:
function trigger(target, key) {const depsMap = targetMap.get(target)if (!depsMap) {return}const dep = depsMap.get(key)if (!dep) {return}dep.forEach(effect => {if (effect.scheduler) {effect.scheduler()} else {effect.run()}})
}
其中,scheduler是一个可选的参数,表示watcher对象的调度函数。如果存在调度函数,则会先执行调度函数,再执行run方法。
下面是watch底层源码的主要实现步骤:
-
创建一个Proxy对象,用于监听数据的变化。
-
在Proxy对象的set方法中,触发watcher实例的回调函数。
-
在watcher实例的回调函数中,执行用户定义的回调函数,并将新旧值传递给回调函数。
-
在回调函数中,执行用户定义的逻辑,例如更新组件的视图。
下面是watch底层源码的简单实现:
function watch(source, callback) {const watcher = {callback: callback,oldValue: null,update() {const newValue = source();if (newValue !== this.oldValue) {this.callback(newValue, this.oldValue);this.oldValue = newValue;}}};watcher.update();return watcher;
}function reactive(obj) {return new Proxy(obj, {set(target, key, value) {target[key] = value;watchers.forEach(watcher => watcher.update());return true;}});
}const data = reactive({ count: 0 });const watchers = [];watchers.push(watch(() => data.count, (newValue, oldValue) => {console.log(`count changed from ${oldValue} to ${newValue}`);
}));data.count++; // count changed from 0 to 1
在上面的代码中,我们定义了一个watch函数和一个reactive函数。watch函数用于创建watcher实例,reactive函数用于创建Proxy对象。当数据发生变化时,Proxy对象的set方法会触发watcher实例的回调函数,从而更新组件的视图。
相关文章:
解读vue3源码(3)——watch
Vue3的watch底层源码主要是通过使用Proxy对象来实现的。在Vue3中,每个组件实例都会有一个watcher实例,用于监听组件数据的变化。当组件数据发生变化时,watcher实例会触发回调函数,从而更新组件的视图。 Vue3的watch底层源码主要涉…...
优秀简历的HR视角:怎样打造一份称心如意的简历?
简历的排版应该简洁工整,注重细节。需要注意对齐和标点符号的使用,因为在排版上的细节需要下很大功夫。除此之外,下面重点讲述几点简历内容需要注意的地方。 要点1:不相关的不要写。 尤其是与应聘岗位毫不相关的实习经历&#x…...
系统集成项目管理工程师——考试重点(三)项目管理一般知识
1.项目定义: 为达到特定的目的,使用一定资源,在确定的期间内,为特定发起人提供独特的产品、服务或成果而进行的一系列相互关联的活动的集合。 2.项目目标: 成果性目标:项目产品本身 约束性目标&…...
为什么医疗保健需要MFT来帮助保护EHR文件传输
毫无疑问,医疗保健行业需要EHR技术来处理患者,设施,提供者等之间的敏感患者信息。但是,如果没有安全的MFT解决方案,您将无法安全地传输患者文件,从而使您的运营面临遭受数据泄露,尴尬࿰…...
对项目总体把控不足,项目经理应该怎么办?
公司现状:项目人员紧缺,只有两人了解此项目技术细节,其中一个不常驻现场,另一个是执行项目经理李伟。 项目经理王博是公司元老,同时负责多个项目,工作比较忙,不常驻现场,没有参加过…...
【学习笔记】CF603E Pastoral Oddities
先不考虑数据结构部分,尝试猜一下结论。 结论:一个连通块有解当且仅当连通块的度数为偶数。 然后这题要你最大边权最小。最无脑的方法就是直接上 lct \text{lct} lct。真省事啊 我第一眼想到的还是整体二分。这玩意非常好写。 但是为什么也可以用线段…...
如何使用ESP32-CAM构建一个人脸识别系统
有许多人识别系统使用签名、指纹、语音、手部几何、人脸识别等来识别人,但除了人脸识别系统。 人脸识别系统不仅可以用于安全目的来识别公共场所的人员,还可以用于办公室和学校的考勤目的。 在这个项目中,我们将使用 ESP32-CAM 构建一个人脸识…...
JavaWeb分页条件查询参数特殊字符处理
问题背景 在项目开发过程中,基本都会有列表条件查询,例如用户管理会有通过用户姓名模糊查询用户,课程管理会有课程名称模糊查询课程等等。 而查询过程中如果用户在界面上输入一些特殊字符,例如:%_等等,这…...
ubuntu18服务安装
一、JDK安装 将jdk解压缩到该目录 /opt/ sudo tar -zxvf jdk-8u261-linux-x64.tar.gz -C /opt/ #重命名 cd /opt sudo mv jdk-8u261-linux-x64 jdk_8 修改环境变量 sudo vi ~/.bashrc #在文件最后追加以下文本 #进入编辑器后输入以下指令: #1. G //将光标移到最后一…...
这些使用工具大推荐,现在知道不晚
1.Snip Snip是一款截图软件,它突出的优点就是可以制作滚动截图。 例如:对整个网页进行截图,使用Snip即可轻松获取,无需处理水印。 2.Sleep Cycle 快节奏、高压力的生活导致我们越来越晚睡觉,睡眠质量越来越差。 想提…...
【Java|golang】1048. 最长字符串链
给出一个单词数组 words ,其中每个单词都由小写英文字母组成。 如果我们可以 不改变其他字符的顺序 ,在 wordA 的任何地方添加 恰好一个 字母使其变成 wordB ,那么我们认为 wordA 是 wordB 的 前身 。 例如,“abc” 是 “abac”…...
Hive基础和使用详解
文章目录 一、启动hive1. hive启动的前置条件2. 启动方式一: hive命令3. 方式二:使用jdbc连接hive 二、Hive常用交互命令1. hive -help 命令2. hive -e 命令3. hive -f 命令4. 退出hive窗口5. 在hive窗口中执行dfs -ls /; 三、Hive语法1.DDL语句1.1 创建数据库1.2 两…...
c/c++:栈帧,传值,传址,实参传值给形参,传地址指针给形参
c/c:栈帧,传值,传址,实参传值给形参,传地址指针给形参 2022找工作是学历、能力和运气的超强结合体,遇到寒冬,大厂不招人,此时学会c的话, 我所知道的周边的会c的同学&…...
玩元宇宙血亏后 蓝色光标梭哈AI也挺悬
蓝色光标2022年年度报告出炉,巨亏21.75 亿元,其中20.38亿亏损因商誉、无形资产及其他资产减值造成,而在实际亏损业务中,元宇宙占比不小。 蓝色光标在元宇宙领域的布局,主要通过三家子公司实施,分别为蓝色宇…...
生物---英文
标题 前言必学场景词汇及用法鸟类昆虫类哺乳类爬行类情境常用单词鸟类虫类哺乳类两栖类与爬行类分类与动物相关的习语前言 加油 必学场景词汇及用法 鸟类 1bird [b[插图]d] n.鸟bird’s-eye-view[ˈb[插图]dzaɪˌvju]adj.鸟瞰图的a bird’s-eye view鸟瞰a flock of bird…...
ENVI 国产高分2号(GF-2)卫星数据辐射定标 大气校正 影像融合
1.数据 高分2号卫星数据,包含: MSS-1\2多光谱数据,4m分辨率; Pan-1\2全色波段数据,0.8m分辨率。 2.处理软件 ENVI5.3 国产插件下载地址:ENVI App Store (geoscene.cn) 首先下载插件文件; …...
操作系统考试复习——第二章 进程控制 同步与互斥
进程控制一般是由OS中的原语来实现的。 大多数OS内核都包含了两大方面的功能: 1.支撑功能:1)中断处理 2)时钟管理 3)原语操作(原语操作就是原子操作。所谓原子操作就是一个操作中所有动作要不全做要不全不做) 2.资源管理功能:1)进程管理…...
mac gitstats查看git提交记录
一、介绍: 进一步来讲,Gitstats它是一个git仓库分析软件,它可以检查仓库并生成历史数据的统计信息。可以帮助你查看git仓库的提交状态,根据不同维度分析计算,并自动生成数据图表。 官网介绍:http://gitst…...
电脑系统错误怎么办?您可以看看这5个方法!
案例:电脑出现系统错误该如何解决? 【这几天长时间使用我的电脑,导致它的系统出现了错误。有没有小伙伴知道如何解决电脑系统出错的问题?求一个能快速解决的方法。】 电脑系统出现错误是使用电脑时难免会遇到的问题之一…...
九款顶级AI工具推荐
ChatGPT OpenAI开发的最强对话系统 地址:chat.openai.com ChatGPT能够在同一个会话期间内回答上下文相关的后续问题。其在短时间内引爆全球的原因在于,在网友们晒出的截图中,ChatGPT不仅能流畅地与用户对话,甚至能写诗、撰文、编…...
使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式
一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明:假设每台服务器已…...
【网络】每天掌握一个Linux命令 - iftop
在Linux系统中,iftop是网络管理的得力助手,能实时监控网络流量、连接情况等,帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...
dedecms 织梦自定义表单留言增加ajax验证码功能
增加ajax功能模块,用户不点击提交按钮,只要输入框失去焦点,就会提前提示验证码是否正确。 一,模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...
《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》
在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中࿰…...
反射获取方法和属性
Java反射获取方法 在Java中,反射(Reflection)是一种强大的机制,允许程序在运行时访问和操作类的内部属性和方法。通过反射,可以动态地创建对象、调用方法、改变属性值,这在很多Java框架中如Spring和Hiberna…...
Python如何给视频添加音频和字幕
在Python中,给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加,包括必要的代码示例和详细解释。 环境准备 在开始之前,需要安装以下Python库:…...
大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计
随着大语言模型(LLM)参数规模的增长,推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长,而KV缓存的内存消耗可能高达数十GB(例如Llama2-7B处理100K token时需50GB内存&a…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...
BLEU评分:机器翻译质量评估的黄金标准
BLEU评分:机器翻译质量评估的黄金标准 1. 引言 在自然语言处理(NLP)领域,衡量一个机器翻译模型的性能至关重要。BLEU (Bilingual Evaluation Understudy) 作为一种自动化评估指标,自2002年由IBM的Kishore Papineni等人提出以来,…...
什么是VR全景技术
VR全景技术,全称为虚拟现实全景技术,是通过计算机图像模拟生成三维空间中的虚拟世界,使用户能够在该虚拟世界中进行全方位、无死角的观察和交互的技术。VR全景技术模拟人在真实空间中的视觉体验,结合图文、3D、音视频等多媒体元素…...
