Vue3-响应式原理解析

news2024/9/29 22:49:36

vue3 与 vue2 主要差异之一无疑是响应式实现上的改变。本文主要阐述响应式原理的实现方式解析以及核心源码阅读的注释理解。

本文主要对响应式实现原理进行逻辑梳理,舍弃枯燥无味的代码,只用图解/文字进行功能描述,具体实现请自行阅读。保重!!!

如果问题,虚心求教,还请指出!!!

先回顾一下Vue2的响应式原理:

image.png

灰色-初始化声明,蓝色-收集副作用,红色-触发副作用

个人整理绘制,有误还望指出

Vue2响应式原理流程:

构建响应式数据:

以data选项为入口,对data对象使用Object.defineProperty 对每个字段设置 getter/setter 拦截器进行拦截,同时为每个字段都创建了一个dep集合,用于收集跟字段有关的所有依赖对象(watcher)。如果字段值是 arrar/object,进行递归处理。由于vue2无法监听数组长度、索引值的改变,只能通过扩展数组常用的api方法(push/pop…),进行 setter 拦截。

依赖收集:

依赖收集主要发生在 computedwatchupdate(render) 过程。

如果声明 computed 选项,在初始化computed字段时,会为每个computed字段声明一个对应的watcher实例依赖对象,同时在vm实例上直接挂载computed字段,使用定义的computed函数作为字段的getter拦截器,并且默认执行一次来获取初始值。在计算时,如果有使用响应式字段,会触发字段的getter拦截器,这时就会发生依赖收集,将computed字段对应的watcher实例加入响应字段对应的 dep集合 中,同时也把 dep集合 存在 watcher实例中(双向绑定)。computed字段默认是响应式的,所以也维护了一个对应的dep集合,依赖收集同data对象字段。如果为computed字段设置指定 set,作为computed字段的setter拦截器。

computed字段具有缓存cache属性,当依赖的响应字段更新,并会立即触发依赖更新,只打上需要重新计算的标识(dirty=true),当依赖重新读取computed字段时,在重新计算获取最新值;如果直接通过set赋值,不需要computed重新计算依赖就能获取最新值。

如果声明 watch 选项 / $watch,在遍历每个watch时,会为每个watch都创建一个对应的watcher实例依赖对象,以及解析监听的响应字段,获取监听字段的初始值&#x

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

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

相关文章

xxl_job任务调度简单使用

一、概念 任务调度是为了自动完成特定任务,在约定的特定时刻去执行任务的过程 如以下应用场景: 某电商平台需要每天上午10点,下午3点,晚上8点发放一批优惠券 某银行系统需要在信用卡到期还款日的前三天进行短信提醒 某财务系统…

UEditor百度富文本后端上传文件接口

UEditor百度富文本后端上传文件接口 直接上代码 接口: RequestMapping("/UEditorConfig")public String list(HttpServletRequest request, HttpServletResponse response) throws IOException {String config environment.getProperty("ueditor.c…

60%公司推行精益管理失败都源于同一原因,这个原因是...

精益管理在许多公司中已经成为提高运营效率、减少浪费、和提升客户满意度的重要方法。或者你觉得惊讶,根据我们的经验,超过60%的公司在实施精益管理失败,我们发现他们都有一个共同的原因,这个原因就是公司没有跟踪正确的指标&…

【图文并茂】ant design pro 如何优雅奇妙地把 crud 的 api 单独抽出来共用

我们写后台项目,经常要写增删改查的接口。 比如 角色 权限 我们不可能都写一个 api 比如 getRoles, getPermissions 这些请求列表的,都是一样的,只是路径不同 那么我们应该抽出来,放到一起,直接去调,只…

双向电表是什么电表?为什么光伏发电储能要求安装双向电能表!

双向电表是什么电表? 双向电表就在用电的时候假如是正转,那么向外送电的时候就是反转,也就是读数越来越小。反总是指反向总有功,反无是指反向总无功。 双向电表,也称为双向计量电能表,是一种能够计量用电和发电的电…

第三节:Nodify 添加连接关系

引言 Nodify有三层结构,编辑器Editor,节点Node和连接组件Connection,上节介绍了节点和编辑器,本节介绍连接组件。连接组件用于保存节点中连接端子的连接关系,并随节点的拖动改变。 1、连接组件 连接组件存储一个连接关…

海外媒体软文发稿【越南通讯社vnanet】官方媒体发布新闻稿

海外媒体软文发稿【越南通讯社vnanet】官方媒体发布新闻稿 越南通讯社(越南语:Thng tấn x Việt Nam;英语:Vietnam News Agency,简称VNA),简称“越通社”是越南国家通讯社,始建于1945年9月2日。越通社是越…

JVM的内存模型和垃圾回收

JVM内存区域 内存模型图: 堆 线程共享。所有的对象实例以及数组都要在堆上分配。回收器主要管理的对象。 它的目的是存放对象实例。同时它也是GC所管理的主要区域,因此常被称为GC堆,又由于现在收集器常使用分代算法,Java堆中还…

纷享销客AI能力在线索精细化管理中的应用与实践

1、智能评分提高线索转换效率 企业可以经过后台模型配置,和对近1-2年内线索的相关属性进行整理分析,纷享销客AI可以总结出历史相似线索的转换概率,使销售人员可以集中精力在更容易转换的线索上,提高转化效率。 纷享销客AI的智能…

pdf如何转换为jpg图片?这几种转换方法简单又实用!

pdf如何转换为jpg图片?PDF,这一广泛应用于文档传输与存储的格式,虽极大地促进了信息的电子化流通,但在日常办公实践中,也逐渐显露出其局限性,尤其是在文件管理与网络分享方面,PDF的庞大体积常导…

fastadmin 时间选择器可选择具体的时分秒

预期要达到的样式,时间区间可以直接选择具体的时分秒 找到这个文件require-form.js 在pulic/assets/js 下面 找到datetimepicker 属性 设置为true var options {timePicker: true,autoUpdateInput: false,timePickerSeconds: true,timePicker24Hour: true,autoApply: true,lo…

Llama 3.1 70B与Mistral Large 2 128B深度对比

在人工智能的浩瀚宇宙中,两颗新星正在引发行业内的轰动。Meta 的 Llama-3.1-70B 和Mistral Large-2-128B,这两大 AI 巨头以其前所未有的计算能力和复杂性,正引领着智能算法的新浪潮。它们不仅仅是技术的集大成者,更是未来可能性的…

基于微信小程序的点餐小程序/基于微信小程序的订餐系统设计与实现

微信点餐小程序 摘 要 随着互联网技术不断地发展,网络成为了人们生活的一部分,而点餐系统作为网上应用的一个全新的体现,由于其特有的便捷性,已经被人们所接受。目前主流的点餐服务不仅不明确并且管理员管理起来不容易&#xff0…

公司最大的内卷,偷偷做单元测试

一位读者在看过我的《理解这八大优势,才算精通单元测试》后,问我:知道单元测试有好处,但实在没空写。看完文章后又想重新落实一下,有没有啥写好单元测试的技巧? 这位读者绝对不是第一个和我抱怨单元测试的…

安卓窗口window无法移除屏幕外超过屏幕边界?-wms源码层面深入剖析

背景 学习了上一节的窗口位置变化相关的内容后,在窗口移动过程过程中发现有一个限制问题,大家可以看一下如下动态图: 已经尽力把窗口想要拖到屏幕外面,但是一直拖到不生效,只能在屏幕内部进行移动,这个到…

智能叮咚门铃的功能,开启未来家居安全新篇章

在科技日新月异的今天,智能家居产品正逐步渗透到我们生活的每一个角落,其中,智能叮咚门铃作为家庭安防与便捷生活的重要一环,正经历着前所未有的功能升级与变革。 一、高清夜视,全天候守护 全新智能叮咚门铃配备了高清…

芒果/充电桩系统云快充1.5底层协议源码(源码)

充电桩系统云快充1.5底层协议源码(源码) 介绍 云快充协议云快充1.5协议云快充协议开源代码云快充底层协议云快充桩直连桩直连协议充电桩系统桩直连协议 软件架构 1、提供云快充底层桩直连协议,版本为云快充1.5,对于没有对接过…

网上都是Python淘汰了!Python没用了!为什么都看不上Python?

最近,看到网上好多人站在在职程序员的角度去分析编程语言的一个优劣,劝小白学这个语言别学那个语言,这对小白来说是毫无意义的。 但是它又具有极强的一个误导性。 针对“Python没用了?马上就要被淘汰啦?为什么这么多…

8月22日笔记

解决centos7本地服务器刚安装之后yum install -y wget出现问题情况 首先网络能ping得通,然后就是yum命令会出问题,网上很多方法都是用wget命令来解决的,但是本身就没有wget,我怎么解决😅。还有就是改/etc/sysconfig/n…

推荐并整理一波vscode插件(哪些内置了,哪些好用)

文章目录 背景现在还在用的(21款)Chinese(Simplified)简体中文Chinese LoremLorem ipsumCode Runner(很推荐)Codeium: AI Coding Autocomplete(推荐)Draw.io IntegrationESLintHighlight Matching TagJavaS…