Vue源码整理, 数据代理和响应式

Vue中的MVVM模型、数据代理、响应式原理和双向绑定原理知识点 阅读详情

最近看了一下Vue相关的东西 ,整理一下流程:

1. 数据代理 -> Object.defineProperty()
  let vm = new Vue({	
   	data:{
   		a:0
   	}
   })
   // 为什么能通过 vm.a 访问到 data 中的 a ?
   // 因为会通过 Object.defineProperty 设置了数据代理
   Object.defineProperty(vm, 'a', {
   	get(){
           return data.a
       },
    set(val){
       	data.a = val
  	   }
   })	

2. 模板解析 -> NodeType -> Reg -> {{}} -> v-on -> bind/html/class/text

Vue 2 是虚拟节点VNode

  let vm = new Vue({	
      el: '#my',
  	data:{
  		a:0
  	}
  })
  // 拿到 el 对应的模板以后, createDocumentFragment() 产生一个Dom片段
  // 再将el所有子节点插入到该Fragment
  // 遍历Fragment中每个节点
  // 文本 => 匹配{{}}
  // 元素 => 编译元素的指令
  // 普通指令/事件指令 => 编译完后删除该指令
  // 包含子节点 => 继续迭代 
3. 数据绑定和响应式 -> 使用数据劫持的技术实现

一旦更新data中某个属性数据, 所有界面直接使用或间接使用该属性的节点会更新
基本思路: 通过defineProperty监视data中所有层级数据的变化, 变化则更新界面

vm.a = 3
=> vm.a.set // 更新data中的a
=> vm.data.a = 3
=> vm.data.a.set //更新界面
增加observe => 递归对每个属性 Object.defineProperty 增加 get set, 并且设为configurable:false
除了事件指令, 每个指令/表达式 => 增加watcher

Dep -> {
	实例创建时间 => 给data中每个属性增加observe数据劫持时(增加get,set)创建的, 在模板编译之前, new watcher()以前
	数量 => 与data中属性一一对应(所有层级)
	结构 => {
		id: 标识 uid
		subs: [] subscribe订阅者数组, 内容是 watchers // 即需要更新的所有相关表达式
	}
}
watcher -> {
	实例创建时间 => 初始化解析大括号表达式/一般指令时创建
	数量 => 与大括号表达式/一般指令一一对应
	结构 => {
		cb: cb 界面更新回调
		vm: vm
		exp: 对应的表达式
		depIds: {} 相关的n个dep      // 主要用于判断关系是否建立, 避免再次建立dep watcher关系
		value: get() 当前表达式value
	}
}

Dep与Watcher关系
关系 ->
	data属性 -> 一个dep -> n个watcher(属性在模板多次使用)
	表达式 -> watcher -> n个dep(多层表达式, 如a.b, 对应了两个dep)
建立 ->
	初始化data数据 -> 每个数据增加dep, 并增加 get, set -> 编译模板 -> 拿到表达式 -> 每个表达式增加一个watcher -> watcher初始化会有个value属性 -> 该value属性调用了dep的get方法 -> dep的get方法depend() -> 通过watcher的depIds判断关系是否建立 -> dep 保存watcher到subs -> watcher 的depIds保存dep
响应式 ->
	vm.name = 'abc' -> data中name属性值变化 -> name的 set() -> dep.notify()  -> dep中subs数组中每个watcher进行update() -> watcher.cb 回调 -> updater更新界面


总结

整体实现分为已下步骤

  1. 实现一个Observer,对数据进行劫持,通知数据的变化(将使用的要点为:Object.defineProperty()方法)
  2. 实现一个Compile,对指令进行解析,初始化视图,并且订阅数据的变更,绑定好更新函数
  3. 实现一个Watcher,将其作为以上两者的一个中介点,在接收数据变更的同时,让Dep添加当前Watcher,并及时通知视图进行update
  4. 实现一些VUE的其他功能(Computed、menthods)
  5. 实现MVVM,整合以上几点,作为一个入口函数

在这里插入图片描述

Vue3-响应式原理解析 vue3 与 vue2 主要差异之一无疑是响应式实现上的改变。本文主要阐述响应式原理的实现方式解析以及核心源码阅读的注释理解。本文主要对响应式实现原理进行逻辑梳理,舍弃枯燥无味的代码,只用图解/文字进行功能描述,具体实现请自行阅读。保重!!!如果问题,虚心求教,还请指出!!! 阅读详情

相关推荐

Vue响应式原理:Object.defineProperty数据劫持机制详解

响应式是前端框架实现数据驱动视图更新的核心机制,其本质在于对数据访问行为的主动拦截与控制。Vue 2.x 基于 Object.defineProperty 实现属性级劫持,通过重写 getter/setter 在数据读写时触发依赖收集与更新通知,而非被动监听赋值操作。该机制决定了响应式系统的边界能力:无法响应对象动态新增属性、数组索引赋值等场景,根源在于 defineProperty 的静态性与属性粒度限制。理解这一底层原理,有助于精准排查 this.msg 赋值无效、v-for 渲染空白等高频问题,并为过

weixin_30621465的博客 182

vue数据代理、劫持、监视(实现响应式)

列表渲染

小白目的博客 2120

射频收发机(RF Transceiver)

2,既然原来外差的思路是把声音频率的信号,通过混频搬移到高频电磁波频率,那对高频率信号放大的时候,是不是也可以先在比较低的射频频率进行放大,然后再通过频率搬移的方式,将放大后的信号搬移到高频率呢?频率搬移过程中,中间预先设定的固定射频频率被称为“中频”(中间频率,IF,Intermediate Frequency),由于这个频率超出了声音可听的范围,是“超声波”(supersonic),所以被命名为“超外差”(Super-Heterodyne)。混频后的信号在0频率附近,可能会发生DC偏移。

2301_77317229的博客 1122

【Vue全解0】Vue实例

目录 内存图 option里面有什么 颜色的表示重要程度 一、内存图 二、option里面有什么 三、颜色的表示重要程度 红色属性 易学、必学 黄色属性 高级一点的属性,理解需要费点劲 绿色属性 自己看文档就会 蓝色属性 不常用,可学可不学 紫色属性 特殊属性,需要特别了解 灰色属性 很不常用,用到时看文档。 ...

qq_44906900的博客 362

工控安全政策系列导读:国际标准IEC 62443标准系列

IEC 62443由ANSI/ISA提出,被ISO/IEC采纳,所以该标准会以不同的名字出现,包括:ANSI/ISA-99,ISA-99,ISA 62443,ISO/IEC 62443,ISO 62443,IEC 62443。其中IEC 62443-2-1已等同采纳为国标,于2016年10月发布,标准编号为GB/T 33007。 IEC 62443是在国...

weixin_34132768的博客 2623

scRNA-seq的fastq文件处理流程——持续更新

获得了一批新的scRNA-seq的fastq.gz文件,每个样本的数据形式为: 我打算使用10X cellranger处理fastq.gz文件,下载及安装方式在官网:https://support.10xgenomics.com/single-cell-gene-expression/software/downloads/2.0这个网址写了10X cellranger处理fastq.gz文件的命名规则https://support.10xgenomics.com/single-cell-gene-expr

watermel__的博客 3198

vue3.0 响应式代理和vue2区别

通过Proxy(代理):拦截对data任意属性的任意(13种)操作,包括属性值的读写,属性的添加,属性的删除等... 通过Reflect(反射):动态对被代理对象的相应属性进行特定的操作

weixin_43294560的博客 386

过压保护电路(OVP)

作者:AirCity 2020.2.4 Aircity007@sina.com 本文所有权归作者Aircity所有 1 示例一 当VBUS=5V时,各点电压电流如图所示,Q1接近截止,输出信号是5V。 当VBUS=5.4V开始,输出信号开始下降,直到VBUS=6.1V,输出信号降低为0.6V。 下面是实测波形,这个电路,输出信号的电压不会超过5.4V,这个输出信号可用于电源的控制信号。 2 ...

AirCity123的博客 3万+

Vue.js 计算机属性computed和methods里的方法

在使用Vue.js时,会发现调用menthods里的方法也可以与计算机属性起到同样的作用,如: <div id="app"> <!--利用计算机属性实现逆向文本的效果--> <input type="text" v-model="text" property="请输入要逆转的文本/> <

love_pgme的博客 1349

CAPL与人工智能结合

AI模型是指通过机器学习算法训练得到的模型,可以用于分类、回归、聚类等任务。常见的AI模型包括神经网络、支持向量机、决策树等。在汽车电子系统中,AI模型可以用于故障诊断、驾驶行为分析、自动驾驶等场景。实时决策是指在汽车电子系统中,根据AI模型的预测结果,实时做出决策。实时决策可以用于自动驾驶、故障诊断等场景。通过本文的学习,读者应该对CAPL与人工智能结合有了初步的了解,并能够编写复杂的CAPL脚本。

闲人编程的博客 1481

一、【vmware虚拟机使用】安装vmware workstations17

本文介绍了VMware Workstation 17的安装与网络配置方法。主要内容包括:通过下载安装包进行标准安装(含许可协议、路径选择等步骤);重点讲解了NAT模式下的网络配置,包括修改子网IP为192.168.2.0网段、设置网关地址和DHCP范围等操作,以避免与主机网络冲突。文章还简要说明了VMware的Hypervisor核心技术原理,包括CPU、内存和存储虚拟化。最后指出完成这些准备工作后,后续将进行CentOS7系统的安装。整个流程配有详细图文说明,适合初学者跟随操作。

信创运维工程师 · 银河麒麟 & 容器实战 | 金融生产环境迁移·等保加固 | 142篇原创·17万+阅读 2746

VUE中实现数据代理和数据劫持(Vue原理之步骤二)

整理面试题,不是让大家去只刷面试题,而是熟悉目前实际面试中常见的考察方式和知识点,做到心中有数,也可以用来自查及完善知识体系。《前端基础面试题》,《前端校招面试题精编解析大全》,《前端面试题宝典》,《前端面试题:常用算法》PDF完整版点击这里领取识点,做到心中有数,也可以用来自查及完善知识体系。《前端基础面试题》,《前端校招面试题精编解析大全》,《前端面试题宝典》,《前端面试题:常用算法》PDF完整版点击这里领取[外链图片转存中…(img-jRfgPkBX-1712975544507)]

2401_84092694的博客 1155

Spring AI Alibaba实战训练营-05模型输出质量评估

本文介绍了使用Spring AI Alibaba库评估AI模型输出质量的方案。项目通过5种评估器实现自动化评估:相关性评估、事实准确性评估、答案相关性评分、答案正确性评估和忠实度评估。开发步骤包括环境准备(Java 17、Maven、API Key获取)、创建Maven项目、配置Spring AI(通过环境变量安全设置API Key)以及实现RAG流程。重点强调了通过评估器自动检测AI输出的质量指标,帮助开发者优化AI应用性能。

program哲学 217

VUE中实现数据代理和数据劫持(Vue原理之步骤二),新手学web前端开发

基础知识是前端一面必问的,如果你在基础知识这一块翻车了,就算你框架玩的再6,webpack、git、node学习的再好也无济于事,因为对方就不会再给你展示的机会,千万不要因为基础错过了自己心怡的公司。前端的基础知识杂且多,并不是理解就ok了,有些是真的要去记。当然了我们是牛x的前端工程师,每天像背英语单词一样去背知识点就没必要了,只要平时工作中多注意总结,面试前端刷下题目就可以了。什么?你问面试题资料在哪里,这不是就在你眼前吗(滑稽。

2401_84093407的博客 968

【AI Agent 记忆共享实战】【下篇】多 Agent 会话 Session 统一共享实战:全链路工程落地、采集归一、MCP 服务、私有化部署、源码级实战

中篇我们已经锁定最终最优架构方案: 非侵入式、外部旁路采集、只读归一、中心化存储、MCP 按需检索注入。摒弃「改 Agent 源码」「软链接互通」「原生 Session 互导」等不现实方案。本篇直接落地可上线、可简历复用、可个人私有化部署多 Agent 异构 Session专属采集器(Claude/CODex/DSH/OpenCode/Kimi/WorkBuddy/ 豆包)统一消息归一化解析层(解决所有 Schema 异构)增量同步、去重、时间戳对齐核心逻辑。

十年老程序猿,AI 疯狂研究专家,前沿硬核知识分享 483

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Vue2 和 Vue3 区别 — 源码深度解析

Vue2 和 Vue3 区别 — 源码深度解析

layneyao的博客 1959

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Vue 3 响应式核心源码详解(基于 @vue/reactivity)

Vue 3 响应式系统核心源码解析:通过 @vue/reactivity 包实现响应式数据管理。主要包含 reactive(基于 Proxy 代理对象)、ref(通过 getter/setter 控制单值)、effect(依赖收集与触发)等核心机制。系统采用订阅-发布模式,通过 track 收集依赖,trigger 触发更新,ReactiveEffect 封装副作用函数。computed 实现缓存机制,watch 监听数据变化。整个系统通过代理对象和依赖收集构建高效响应式架构。

Jinxiansen0211的博客 580

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

讲讲vue3下会造成响应式丢失的情况

我们一开始接触vue3的时候,会对这个问题十分的不解,只是知道有这个问题而不知其根,今天就来讲讲这个问题。obj = test;通过reactive()包含的对象是进行了内部的proxy代理,因此具有响应式。但是像test这个对象,它是没有进行数据劫持的,而对象赋值的时候实际上是引用地址赋值。那么obj这个对象变成了一个没有数据劫持的引用地址,那么它也就失去了响应式。但是obj1重新赋值时会保留自身的响应式。其实很简单,跟上图的代码是有关的。细心的人会发现,在set函数里面有这么一段代码。

发果叁 8648

图解 Vue 响应式原理

最近部门分享,有同学提到了 Vue 响应式原理,大家在讨论时,发现一些同学对这一知识理解还不够深入,不能形成一个闭环,为了帮助大家理解这个问题,我重新过了一下 Vue 源码,并整理了多张...

小生方勤 364

VUE中实现数据代理和数据劫持(Vue原理之步骤二),2024年最新oppo社招前端面试

正值招聘旺季,很多小伙伴都询问我有没有前端方面的面试题!网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。需要这份系统化的资料的朋友,可以添加V获取:vip1024c (备注前端)一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

m0_60721823的博客 360

【vue3】04. 跟着官网学习vue3-响应式基础

跟着官网学习vue3 响应式原理

有一棵树的博客 1905

Vue3响应式:ref vs reactive,5分钟消除使用困惑

Vue3用久了,你会不会对自己手下的代码产生一些疑问?比如说: - *有了`reactive`,那还需要 `ref` 干啥?* - *同样是响应式代理,为什么只有`ref`可以代理原始数据,`reactive`却不行?* - *为什么使用`ref`的值要加上一个麻烦的`.value`?* - *为什么`ref`可以同时代理原始数据

qq_39222910的博客 1277

VUE中实现数据代理和数据劫持(Vue原理之步骤二),2024年最新金九银十后面接一句

除了简历做到位,面试题也必不可少,整理了些题目,前面有117道汇总的面试到的题目,后面包括了HTML、CSS、JS、ES6、vue、微信小程序、项目类问题、笔试编程类题等专题。一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!一个人可以走的很快,但一群人才能走的更远。

m0_74931199的博客 978

【Vue系列】Vue3.0知识点汇总整理

(1) 性能的提升(2)源码的升级;使用Proxy代替defineProperty实现响应式;重写虚拟DOM的实现和Tree-Shaking(3)拥抱TypeScript(4)新的特性1.Composition API(组合API)2.新的内置组件3.其他改变ref用来定义:基本数据类型;reactive用来定义:对象(或数组)类型数据;备注:ref也可以用来定义对象或数组类型数据,它内部会自动通过reactive转为代理对象;定义。

pakerder的博客 2605

《Vue.js 技术与实现》第4章 响应式系统的作用和实现 阅读总结

☁️ 2022.03.20 15:30 这一章题序中上来就抛出了如下问题: 什么是响应式数据和副作用函数? 实现中如何避免无限递归? 为什么需要嵌套的副作用函数? 两个副作用函数之间会产生哪些影响? 花费一个晚上+一个下午读完了这一章,读完的第一感觉是信息量巨大。即使之前自己实现过一遍属于自己的 mini-vue,看完本章依然觉得填补了我很多知识盲区,收获很多,但一时很难消化。 此刻难消化的原因:很难在头脑中重现源码中针对哪些问题给出了哪些解决方案? 对于看完之后合上书本让人感觉虚空的问题,决定用自己方

兰亭古墨 1649
上一篇: try里面放return,finally还会执行吗?
下一篇: npm 依赖包版本号~和^的区别
飞驰的地铁
博客等级 码龄11年 13粉丝 64原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值