大白话Vue 双向数据绑定的实现原理与数据劫持技术

咱们来好好唠唠Vue双向数据绑定的实现原理和数据劫持技术,我会用特别通俗的例子给你讲明白。

啥是双向数据绑定

你可以把双向数据绑定想象成一个神奇的“同步器”。在网页里有两部分,一部分是数据,就像你记在小本本上的信息;另一部分是页面上显示的内容,就像展示在黑板上的信息。双向数据绑定就是让小本本上的信息和黑板上的信息始终保持一致。不管你是改了小本本上的信息,还是改了黑板上的信息,另一处都会马上跟着变。

数据劫持技术是咋回事

数据劫持就像是在数据的“家门口”安排了一个小保镖。当有人想要访问或者修改这个数据的时候,小保镖都会知道,并且可以做出相应的动作。在Vue里,用的是 Object.defineProperty() (Vue 2)和 Proxy (Vue 3)这两个工具来当小保镖。

Vue 2 用 Object.defineProperty() 实现数据劫持

咱们以一个简单的对象为例,这个对象就像一个小房子,里面有不同的房间(属性)。

let person = {name: '张三',age: 20
};

现在咱们用 Object.defineProperty() 给这个对象的属性安排小保镖:

let newPerson = {};
Object.defineProperty(newPerson, 'name', {get: function() {console.log('有人要读取 name 属性啦');return person.name;},set: function(newValue) {console.log('有人要修改 name 属性啦,新的值是 ' + newValue);person.name = newValue;}
});

这里的 get 就像是小保镖在有人来访问 name 属性的时候,会喊一嗓子“有人要读取啦”,然后把实际的值给出去;set 就像是小保镖在有人要修改 name 属性的时候,会喊一嗓子“有人要修改啦”,然后把新的值存进去。

Vue 3 用 Proxy 实现数据劫持

Proxy 就像是一个更厉害的大保镖,它可以一次性管整个对象。

let person = {name: '张三',age: 20
};let proxyPerson = new Proxy(person, {get: function(target, property) {console.log('有人要读取 ' + property + ' 属性啦');return target[property];},set: function(target, property, newValue) {console.log('有人要修改 ' + property + ' 属性啦,新的值是 ' + newValue);target[property] = newValue;return true;}
});

这里的 Proxy 会监听整个 person 对象,不管是访问还是修改对象的任何属性,它都能知道。

Vue 双向数据绑定的实现原理

结合上面的数据劫持技术,Vue 实现双向数据绑定主要有这么几个步骤:

1. 数据劫持

Vue 会遍历你定义的数据对象,用 Object.defineProperty() (Vue 2)或者 Proxy (Vue 3)给每个属性或者整个对象安排小保镖,这样就能监听数据的访问和修改。

2. 发布 - 订阅模式

这就像是一个消息通知系统。当数据发生变化时,小保镖(数据劫持)会发出一个消息,告诉所有关注这个数据的地方(比如页面上显示这个数据的区域),数据变啦,你们赶紧更新。而页面上关注这个数据的地方就像订阅了这个消息的人,收到消息后就会更新自己显示的内容。

3. 视图更新

当页面上的输入框等元素发生变化时,Vue 会捕捉到这个变化,然后更新对应的数据。同时,因为数据被劫持了,数据的变化又会触发消息通知,让页面上其他显示这个数据的地方也跟着更新,这样就实现了双向数据绑定。

比如说,页面上有一个输入框显示着 person.name 的值,当你在输入框里修改了名字,Vue 会先更新 person.name 这个数据,然后数据劫持检测到数据变了,就通知页面上所有显示 person.name 的地方更新显示新的名字,这样就保证了数据和页面显示的同步。

双向数据绑定在 Vue 中有哪些优缺点?

双向数据绑定在 Vue 里就像是一把双刃剑,既有优点能让开发变得轻松,也存在一些缺点需要我们留意。下面咱用大白话详细说说它的优缺点。

优点

1. 代码简洁,开发高效

在 Vue 里使用双向数据绑定,能让代码变得特别简洁。你不用手动去写很多代码来实现数据和视图的同步更新。比如说,有一个输入框和一个数据变量绑定了,当你在输入框里输入内容时,数据变量会自动更新;反过来,当数据变量的值改变时,输入框里显示的内容也会自动更新。这就好比你有一个神奇的魔法,让数据和视图自己就能保持一致,大大节省了开发时间和精力。

<template><input v-model="message"><p>{{ message }}</p>
</template><script>
export default {data() {return {message: ''};}
};
</script>

在这个例子中,通过 v-model 指令实现了双向数据绑定,你不需要额外写代码来处理输入框和 message 变量之间的同步。

2. 提高可维护性

双向数据绑定让代码的逻辑更加清晰,维护起来也更容易。因为数据和视图的更新是自动关联的,当你需要修改数据或者视图的显示逻辑时,只需要关注一处的修改,另一处会自动更新。就像你整理一个房间,数据和视图是连在一起的,你动了数据,视图也会跟着整齐,不用分别去调整它们。

3. 增强用户体验

对于用户来说,双向数据绑定能带来更好的交互体验。用户在页面上输入或者操作时,页面能实时响应,给用户一种流畅的感觉。比如在一个表单里,用户输入信息时,页面能马上显示输入的内容,还能根据输入内容进行一些验证和提示,让用户感觉操作很方便。

缺点

1. 增加内存消耗

双向数据绑定需要对数据进行劫持和监听,还得维护一个发布 - 订阅系统来实现数据和视图的同步。这就好比你要雇很多小秘书来盯着数据和视图的变化,然后互相通知,这些小秘书会占用一定的内存。当项目变得很大,数据量很多时,内存消耗就会比较明显,可能会影响页面的性能。

2. 调试难度增加

由于双向数据绑定是自动更新的,当出现问题时,调试起来可能会比较困难。你很难一下子找到是数据的问题还是视图的问题,也不太容易确定数据变化的源头。就像一个复杂的机器,不知道是哪个零件出了故障,需要花费更多的时间和精力去排查。

3. 数据流向不清晰

在一些复杂的项目中,双向数据绑定可能会让数据的流向变得不清晰。因为数据和视图是相互影响的,很难直观地看出数据是从哪里来,到哪里去。这就好比一个迷宫,数据在里面绕来绕去,你很难理清它的路径,可能会导致代码的逻辑变得混乱。

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

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

相关文章

java后端开发day18--学生管理系统

&#xff08;以下内容全部来自上述课程&#xff09; 1.业务分析并搭建主菜单 1.需求 采取控制台的方式去书写学生管理系统 2.分析 1.初始菜单 2.学生类 属性&#xff1a;id&#xff0c;姓名&#xff0c;年龄&#xff0c;家庭住址 3.添加功能 键盘录入每一个学生信息并…

记录一次部署PC端网址全过程

当我查看我之前写的文章时、顿时惊奇发出感慨&#xff1a;啥时候写的&#xff1f;是我写的么&#xff1f;疑惑重重… 所以说&#xff0c;好记性不如烂笔头。 记录一次部署PC端网址全过程 部署PC端网址分是三步&#xff1a;第一步&#xff1a;申请域名并映射到外网IP &#xff0…

本地大模型编程实战(22)用langchain实现基于SQL数据构建问答系统(1)

使 LLM(大语言模型) 系统能够查询结构化数据与非结构化文本数据在性质上可能不同。后者通常生成可在向量数据库中搜索的文本&#xff0c;而结构化数据的方法通常是让 LLM 编写和执行 DSL&#xff08;例如 SQL&#xff09;中的查询。 我们将演练在使用基于 langchain 链 &#x…

利用机器学习实现实时交易欺诈检测

以下是一个基于Python的银行反欺诈AI应用示例代码,演示如何利用机器学习实现实时交易欺诈检测。该示例使用LightGBM算法训练模型,并通过Flask框架构建实时检测API: python import pandas as pd from sklearn.model_selection import train_test_split from sklearn.preproc…

最好的Git实践指南(Windows/Linux双系统详解)

Git最佳实践指南&#xff1a;从入门到熟练&#xff08;Windows/Linux双系统详解&#xff09; 一、环境搭建与基础配置&#xff08;适用Windows/Linux&#xff09; 1.1 Git安装与验证 # Windows系统安装&#xff08;推荐Chocolatey包管理&#xff09; # 直接下载git二进制文件…

Python零基础学习第二天(条件语句,循环语句)

Python零基础学习第二天&#xff1a;流程控制与模块导入 一、流程控制结构 1. 条件语句&#xff08;if, elif, else&#xff09; 条件语句用于根据不同的条件执行不同的代码块。基本形式如下&#xff1a; if 条件1: # 当条件1为True时执行这里的代码 elif 条件2: # 当前面的条…

从零开始用react + tailwindcs + express + mongodb实现一个聊天程序(三) 实现注册 登录接口

1.划分文件夹 在src目录下创建controllers middleware models routes controllers 放具体的方法 signup login middleware 里面是中间件 请求的验证 models 放对象实体 routes 处理访问路径像/signup /login 等等 2. 接口开发 系统的主要 有用户认证 和 消息 2种类型…

使用Socket编写超牛的http服务器和客户端(一)

实现一个高性能的基于 IOCP(I/O Completion Ports)的 HTTP 服务器,支持多线程、动态线程池调整和路由处理。 主要功能和特性 IOCP 模型: 使用多个 IOCP 句柄(IOCP_COUNT),将客户端连接均匀分配到不同的 IOCP 上,减少线程竞争。 工作线程使用 GetQueuedCompletionStatu…

podman加速器配置,harbor镜像仓库部署

Docker加速器 registries加速器 [rootlocalhost ~]# cat /etc/redhat-release CentOS Stream release 8 [rootlocalhost ~]# cd /etc/containers/ [rootlocalhost containers]# ls certs.d policy.json registries.conf.d storage.conf oci registries.conf re…

MOE结构解读和deepseek的MoE结构

不管dense还是MoE&#xff08;Mixture of Experts&#xff09;都是基于transformer的。 下面回顾下解码器块的主要架构&#xff1a; 注意力机制-层归一化&残差连接-FFN前馈神经网络-层归一化&残差连接。 dense模型是沿用了这个一架构&#xff0c;将post-norm换为pre-no…

C#与AI的交互(以DeepSeek为例)

C#与ai的交互 与AI的交互使用的Http请求的方式&#xff0c;通过发送请求&#xff0c;服务器响应ai生成的文本 下面是完整的代码&#xff0c;我这里使用的是Ollama本地部署的deepseek&#xff0c;在联网调用api时&#xff0c;则url会有不同 public class OllamaRequester {[Se…

第九节: Vue 3 中的 provide 与 inject:优雅的跨组件通信

文章目录 前言什么是 provide 和 inject&#xff1f;provide 的基本使用inject 的基本使用provide 提供响应式数据数据provide 提供修改数据的方法provide 提供只读响应数据provide 使用symbol作为注入名inject 默认值总结 前言 在 Vue 3 中&#xff0c;provide 和 inject 是一…

微信小程序-二维码绘制

wxml <view bindlongtap"saveQrcode"><!-- 二维码 --><view style"position: absolute;background-color: #FFFAEC;width: 100%;height: 100vh;"><canvas canvas-id"myQrcode" style"width: 200px; height: 200px;ba…

Linux系统中ssh远程登录协议

目录 一、SSH协议概述 二、SSH协议工作原理 三、ssh服务与配置文件 3.1、openssh 3.2、ssh命令 3.3、服务端配置 四、基于密钥验证的免交互登录 4.1、客户端生成密钥 4.2、将公钥拷贝至服务器 4.3、验证免密登录 一、SSH协议概述 SSH&#xff08;Secure Shell&#x…

vue2 ruoyi websocket轮询

文章目录 前言一、websocket和心跳是什么&#xff1f;二、使用步骤1.2.监听变化3.关闭 总结 前言 websocket&#xff0c;实现与后端通讯&#xff0c;使用心跳机制&#xff0c;断联自动恢复。 一、websocket和心跳是什么&#xff1f; WebSocket WebSocket 是一种网络通信协议&a…

LangChain大模型应用开发:LangGraph快速构建Agent工作流应用

介绍 大家好&#xff0c;博主又来给大家分享知识了。今天给大家分享的内容是使用LangChain进行大规模应用开发中的LangGraph快速构建Agent工作流应用。 通过对前几次对LangChain的技术分享。我们知道LangChain作为一个强大的工具集&#xff0c;为开发者们提供了丰富的资源和便…

学习FreeRTOS推荐几篇质量高的文章

学习FreeRTOS是一个非常好的选择&#xff0c;因为它是一个广泛使用的实时操作系统&#xff08;RTOS&#xff09;&#xff0c;特别适合嵌入式系统开发。以下是一些高质量的文章和视频资源&#xff0c;帮助你入门和深入学习FreeRTOS&#xff1a; 文章推荐 FreeRTOS官方文档 链接…

深入理解Redis:数据类型、事务机制及其应用场景

在当今快速发展的技术领域中&#xff0c;Redis作为一种高性能的内存数据库&#xff0c;已经被广泛应用于各种场景&#xff0c;从简单的缓存实现到复杂的数据处理任务。其灵活性和高效性主要来源于对多种数据结构的支持以及强大的功能特性&#xff0c;如事务处理、持久化选项、高…

k8s集群3主5从高可用架构(kubeadm方式安装k8s)

关键步骤说明 环境准备阶段 系统更新&#xff1a;所有节点执行yum/apt update确保软件包最新时间同步&#xff1a;通过ntpdate time.windows.com或部署NTP服务器网络规划&#xff1a;明确划分Service网段&#xff08;默认10.96.0.0/12&#xff09;和Pod网段&#xff08;如Flann…

Dify部署无法拉取镜像

Dify部署无法摘取镜像 sudo docker compose up -d [] Running 10/10✘ nginx Error Get "https://registry-1.docker.io/v2/": net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiti... 15.2s✘ we…