Vue 的双向数据绑定原理

Vue 的双向数据绑定是通过 数据劫持 + 发布-订阅模式 实现的,具体分为以下三个关键机制:

1. 数据劫持(响应式系统)

Vue 使用 Object.defineProperty(Vue 2)或 Proxy(Vue 3)监听数据变化。

Vue 2 实现:

// 简化版数据劫持
function defineReactive(obj, key) {let value = obj[key];const dep = new Dep(); // 依赖收集器Object.defineProperty(obj, key, {get() {if (Dep.target) {dep.addSub(Dep.target); // 收集依赖(Watcher)}return value;},set(newVal) {if (newVal === value) return;value = newVal;dep.notify(); // 通知所有订阅者更新}});
}

Vue 3 改进:

// 使用Proxy实现
const reactive = (target) => {return new Proxy(target, {get(target, key, receiver) {track(target, key); // 依赖收集return Reflect.get(target, key, receiver);},set(target, key, value, receiver) {Reflect.set(target, key, value, receiver);trigger(target, key); // 触发更新return true;}});
};

2. 依赖收集(发布-订阅模式)

Dep 类:管理依赖(一个属性对应一个Dep)Watcher 类:订阅数据变化,触发更新
class Dep {constructor() {this.subs = [];}addSub(sub) {this.subs.push(sub);}notify() {this.subs.forEach(sub => sub.update());}
}class Watcher {update() {// 执行更新(如重新渲染组件)}
}

3. 模板编译(指令解析)

Vue 编译器将模板中的指令(如 v-model)转换为绑定代码:
<input v-model="message">

编译后相当于:

<input :value="message" @input="message = $event.target.value"
>

双向绑定工作流程

初始化阶段:遍历 data 对象,用 Object.defineProperty/Proxy 劫持所有属性编译模板,为每个绑定创建 Watcher数据访问时(触发 getter):当前 Watcher 被添加到属性的 Dep 中数据修改时(触发 setter):Dep 通知所有 Watcher 更新Watcher 触发组件重新渲染

4、Vue 2 vs Vue 3 实现对比

特性Vue 2Vue 3
核心APIObject.definePropertyProxy
监听范围仅能劫持已定义属性动态新增属性自动响应
数组处理需重写数组方法直接监听数组变化
性能递归遍历所有属性惰性监听,按需触发

5、常见问题解答

Q1:为什么 Vue 3 改用 Proxy?

解决 Vue 2 无法检测对象/数组新增属性的问题性能更好(无需递归初始化所有属性)

Q2:v-model 在自定义组件中的原理?

<CustomComponent v-model="value" />

等价于:

<CustomComponent :modelValue="value"@update:modelValue="newVal => value = newVal"
/>

手写极简双向绑定

// 简易版Vue响应式
class MiniVue {constructor(options) {this.$data = options.data;this.observe(this.$data);this.compile(options.el);}observe(data) {Object.keys(data).forEach(key => {let value = data[key];const dep = new Dep();Object.defineProperty(data, key, {get() {Dep.target && dep.addSub(Dep.target);return value;},set(newVal) {value = newVal;dep.notify();}});});}compile(el) {const element = document.querySelector(el);this.walk(element);}walk(node) {if (node.nodeType === 1) { // 元素节点Array.from(node.attributes).forEach(attr => {if (attr.name.startsWith('v-')) {const dir = attr.name.substring(2);if (dir === 'model') {const key = attr.value;node.value = this.$data[key];new Watcher(this.$data, key, val => {node.value = val;});node.addEventListener('input', e => {this.$data[key] = e.target.value;});}}});}// 递归子节点...}
}
通过这种机制,Vue 实现了数据变化自动更新视图、视图输入自动更新数据的双向绑定效果。

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

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

相关文章

【基于C# + HALCON的工业视觉系统开发实战】三十五、金属表面划伤检测:强反光场景解决方案

摘要:针对金属表面强反光导致划伤检测准确率低的行业痛点,本文提出基于光度立体法的工业视觉检测方案。系统采用“硬件抗反光+算法重建”双策略,硬件上通过可编程分区环形光源、偏振镜头与高动态相机构建成像系统;算法上利用四方向光源序列图像重建表面法向量与高度场,实现…

为什么bert是双向transformer

BERT 是双向 Transformer&#xff0c;这是它的一个核心创新点。下面我从 技术原理、与传统 Transformer 的区别、以及双向性的实际意义 来详细解释为什么 BERT 被称为“双向 Transformer”。一、什么是 BERT 的“双向”&#xff1f;在 BERT 的论文中&#xff0c;双向的原文是 &…

vue中使用Canvas绘制波形图和频谱图(支持.pcm)

实现方式一&#xff1a; vue中使用wavesurfer.js绘制波形图和频谱图 安装colorMap&#xff1a; npm install --save colormap1、单个频谱图 效果&#xff1a; 源码&#xff1a; <template><div class"spectrogram-container"><canvas ref"ca…

【Python系列】Flask 应用中的主动垃圾回收

博客目录一、Python 内存管理基础二、Flask 中手动触发 GC 的基本方法三、高级 GC 策略实现1. 使用装饰器进行请求级别的 GC2. 定期 GC 的实现四、Flask 特有的 GC 集成方式1. 使用 teardown_request 钩子2. 结合应用上下文管理五、智能 GC 策略六、注意事项与最佳实践七、替代…

Linux和shell

最快入门的方式是使用苹果系统。此外&#xff0c;累计补充学习&#xff1a;一、目录结构/bin&#xff0c;二进制文件 /boot&#xff0c;启动文件 /dev&#xff0c;设备文件 /home&#xff0c;主目录&#xff0c;一般外接包、安装包放在这里 /lib&#xff0c;库文件 /opt&#x…

告别内存泄漏:你的Rust语言30天征服计划

欢迎踏上Rust学习之旅&#xff01;第一周&#xff1a;奠定基础 (Week 1: Laying the Foundation)第1天&#xff1a;环境搭建与 “Hello, World!”核心概念: 安装Rust工具链 (rustup)&#xff0c;它包含了编译器rustc和包管理器Cargo。Cargo是你的好朋友&#xff0c;用于创建项目…

乱删文件,电脑不能开机,怎么办

相信不少朋友在清理电脑、释放空间时&#xff0c;都做过一件“后悔一整年”的事——乱删系统文件。本来只是想让电脑快点、干净点&#xff0c;结果第二天一开机&#xff1a;黑屏了、蓝屏了、无限重启了&#xff0c;甚至连桌面都见不到了&#xff01;很多用户在删文件时&#xf…

ICODE SLIX2有密钥保护的物流跟踪、图书馆管理ISO15693标签读写Delphi源码

本示例使用设备&#xff1a;https://item.taobao.com/item.htm?spma21dvs.23580594.0.0.6781645eXF3tm5&ftt&id959258149468 一、密钥认证 procedure TForm1.Button21Click(Sender: TObject); varctrlword:byte;passwordid:byte; //密钥类型status:byte; //存…

核环境特种机器人设备的抗辐照芯片选型方案

摘要&#xff1a;核能作为国家能源安全的重要组成部分&#xff0c;对工业自动化设备的稳定性和可靠性提出了极高的要求。机器人设备在涉核环境下的日常巡检、设备维护、应急响应等任务中发挥着不可替代的作用。然而&#xff0c;涉核环境&#xff0c;尤其是高能粒子的辐照效应&a…

Linux权限系统完全指南:从本质到安全实践

一、权限的本质&#xff1a;Linux安全的核心逻辑在Linux的多用户环境中&#xff0c;权限系统通过三个关键维度实现资源隔离&#xff1a;用户标识 (UID)&#xff1a;系统通过数字ID识别用户&#xff0c;root用户的UID固定为0组标识 (GID)&#xff1a;用户组机制实现批量权限管理…

养老院跌倒漏报率↓78%!陌讯多模态算法在智慧照护中的边缘计算优化

​摘要​​&#xff1a; 针对养老场景中复杂光照与遮挡导致的跌倒漏报问题&#xff0c;陌讯视觉算法通过多模态融合与边缘计算优化&#xff0c;实测显示在RK3588 NPU硬件上实现​​mAP0.5达89.3%​​&#xff0c;较基线模型提升28.5%&#xff0c;功耗降低至7.2W。本文解析其动态…

老年护理实训室建设方案:打造安全、规范、高效的实践教学核心平台

在老龄化社会加速发展的背景下&#xff0c;培养高素质、技能过硬的老年护理专业人才迫在眉睫。一个设计科学、功能完备的老年护理实训室&#xff0c;正是院校提升实践教学质量&#xff0c;对接行业需求的核心平台。本方案旨在构建一个安全、规范、高效的现代化实训环境。点击获…

OpenCv中的 KNN 算法实现手写数字的识别

目录 一.案例&#xff1a;手写数字的识别 1.安装opencv-python库 2.将大图分割成10050个小图&#xff0c;每份对应一个手写数字样品 3.训练集和测试集 4.为训练集和测试集准备结果标签 5.模型训练与预测 6.计算准确率 7.完整代码实现 一.案例&#xff1a;手写数字的识别…

TCP/IP 传输层详解

TCP/IP 传输层详解 传输层&#xff08;Transport Layer&#xff09;是 TCP/IP 模型的第四层&#xff08;对应 OSI 模型的传输层&#xff09;&#xff0c;核心功能是实现 端到端&#xff08;进程到进程&#xff09;的可靠通信。主要协议包括&#xff1a; TCP&#xff08;传输控制…

深度学习笔记:Overview

本文根据吴恩达老师的深度学习课程整理而来&#xff0c;在此表示感知。 文章目录1.课程笔记2.编程作业1.课程笔记 1&#xff09;深度学习笔记&#xff08;1&#xff09;&#xff1a;神经网络基础 2&#xff09;深度学习笔记&#xff08;2&#xff09;&#xff1a;浅层神经网络…

LLM之RAG理论(十八)| ChatGPT DeepResearch 深度研究功能全面技术分析报告

一、背景与行业环境1.1 DeepResearch 的诞生与战略意义ChatGPT DeepResearch&#xff08;深度研究&#xff09;是 OpenAI 于 2025 年 2 月 3 日正式发布的全新 AI 智能体产品&#xff0c;是继 o3-mini 模型发布后&#xff0c;OpenAI 在 AI 研究领域的又一重大突破。这一功能的推…

数据库学习--------数据库日志类型及其与事务特性的关系

在数据库系统中&#xff0c;日志是保证数据可靠性和一致性的重要组成部分&#xff0c;尤其与事务的特性紧密相连。无论是事务的原子性、一致性&#xff0c;还是持久性&#xff0c;都离不开日志的支持。数据库日志&#xff08;Database Log&#xff09;是数据库系统记录自身操作…

如何在 Ubuntu 24.04 或 22.04 LTS 上安装 OpenShot 视频编辑器

OpenShot 视频编辑器是一款轻量级工具,不需要高性能硬件即可编辑视频。它最初是一个爱好项目,后来成为一款拥有简单干净用户界面的流行免费编辑工具。这款直观的视频编辑器可以剪辑影片,并添加额外的视频和音频素材。最终,您可以将作品导出为您选择的格式。本教程将向您展示…

SpringMVC核心原理与实战指南

什么是MVC&#xff1f; MVC英文是Model View Controller&#xff0c;是模型(model)&#xff0d;视图(view)&#xff0d;控制器(controller)的缩写&#xff0c;一种软件设计规范。 MVC是用一种业务逻辑、数据、界面显示分离的方法&#xff0c;将业务逻辑聚集到一个部件里面&am…