浏览器漫谈HTML--2.2从表单标签看vue的响应式系统 理论+实战

embedded/2024/11/28 2:45:03/
htmledit_views">

表单标签的双向绑定是一个很有亮点的功能。在不同框架中他实现这个功能大同小异,这里我们介绍几个常见的框架中他是如何实现双向绑定的。

原生的input输入框是没有双向绑定的功能的。取而代之的,它的input上有一个event对象,这个对象中有一个属性target,而这个target的值就是此时输入框内部的数据。所以如果是原生input,我们需要手动将这个input绑定到我们用于接收这个数据的参数上。

javascript"><!-- 原生input -->
<input type="text" value="初始值" oninput="viewToData(event)"><script>
let data = {value: "初始值"
};function dataToView(){//数据变化的时候触输入框数据更新document.querySelector('input').value = data.value;
}function viewToData(rvent){//输入框数据变化触发底层数据更新data.value = event.target.value;
}
</script>

非常的难看吧。现在很多框架已经帮你做了这一步,自动处理了数据和视图的同步,并且还能处理复杂的数据结构和组件通信,让开发更高效

双向绑定

vue2中想要绑定数据 只需要使用v-model指定参数即可。这是一个语法糖 其实就是将

:value="data",@input = "function"

化简成了一句“v-model"而已。

然后的然后  这样监听数据变化的底层原理又是什么呢?

其实是vue底层的响应式系统在做支撑。

响应式系统

特点

响应式系统是react和vue,特别是vue的一大核心特性。响应式系统是一种能够持续响应变化并自动进行适应的系统,在vue和react中,体现在数据的变化会触发视图的更新。

让我们从0开始,看看要如何才能实现”数据的变化触发视图的更新"。

如果是让我们自己设计,我们会怎么做?肯定就是要监听数据变化,当数据变化的时候给视图更新函数打报告对吧。

那么其实就分为两步,监听数据的变化,以及传递数据数据变化的消息给视图,触发更新。

我们先讲第一个。

如何监听数据变化

一般来说,想要实现监听数据的变化,有这几大方法(设计思路):

数据绑定

        数据绑定的核心思路是将数据和视图层进行连接,使得数据变化时视图自动更新,视图变化时数字更新。在vue中,主要用v-bind实现单项绑定(数据->视图)和v-model(数据<=>视图)。

观察者模式

        观察者模式是一种一对多的关系,一个被观察对象多个观察者。当一个对象的状态发生变化时,所有依赖于它的对象都会得到通知并且自动更新。这种方式能使得对象中的耦合度降低。

发布-订阅者模式

        发布-订阅者模式可以说是一对一关系,允许发布者发送消息,订阅者接收。发布者和订阅者之间没有直接直接通信 而是通过一个中央事件总线或消息代理进行沟通,发布者将事件发送到事件总线,订阅者从事件总线接收消息。有点像js的事件处理队列。

事件驱动模式

        事件驱动模式通过事件的发布和处理来驱动程序的执行,组件通过监听特定的事件来响应用户操作或系统状态变化。使用事件监听器和数据触发机制,组件可以注册事件处理函数。

        数据劫持

        通过调用defineProperty(或proxy),定义setter和getter方法,在数据被读取或修改时执行特定的逻辑。在响应式系统中,数据劫持会在setter时进行以来手机,也就是记录当前的观察者-正在渲染的组件。这通常通过一个全局的依赖数组实现,数据中存储了所有依赖于该数据的组件。在setter执行时,会通知所有依赖于该数据的组件进行更新。

在响应式设计中,实现监听数据变化主要依赖于观察者模式和数据劫持。

数据劫持专注于数据的拦截和响应,确保数据变化时能自动更新视图;而观察者模式则关注对象之间关系和通知机制,适用于更复杂的交互场景。换而言之,数据劫持保证了基础的响应式能力,而观察者模式则允许多个组件或对象之间的解耦和交互。通过这两个手段,实现了响应式设计。

如何通知对应组件进行更新

上文在数据劫持中提到过,依赖收集会在getter中通知所有需要更新的组件。看似很完美的背后其实也是存在问题的:这样的更新,消耗必然不小。那么如何保持尽量高效的速度实现视图的更新呢?

基本分成下面几步:

标记更新

        当数据被更新是,响应式系统会遍历其依赖列表,标记所有依赖于该数据的组件为"需要个更新".

异步更新

        为了提高性能,响应式系统会将需要更新的组件放进一个队列中,使用异步的方式进行更新处理。

        是不是很眼熟?没错,正是js的事件循环机制。事件循环机制允许视图更新事操作放进微任务队列中,顺着队列的执行顺序进行更新。

虚拟dom

        在更新视图时,框架首先会生成新的虚拟DOM树,接着和旧的虚拟DOM树进行比较(diff)。通过比较,框架能找出哪些部分发生了变化,完成最小的更新操作。通过将多个操作合并为一次DOM操作,框架能显著提升性能,减少重排和重绘次数。

实战

实现一个简单的双向绑定

javascript"><template><title>This is title</title><input type="text" id="id-input" @input="handleInput"/><br /><div id="id-div">{{ inputValue }}</div>
</template><script setup>
import { ref,watch } from 'vue';const inputValue = ref('');// 监听 input 事件
const handleInput = (event) => {console.log(event.target.value);//input被触发时更改inputValueinputValue.value = event.target.value;
};//inputValue被更改时更改输入框表单的值
watch(inputValue, (newValue) => {document.getElementById('id-input').value = newValue;
});</script>


http://www.ppmy.cn/embedded/141069.html

相关文章

Linux服务器驱动安装

Linux服务器驱动安装&#xff08;ubuntu为例&#xff09; 驱动安装 在 Ubuntu 上安装 NVIDIA 驱动&#xff0c;主要可以通过以下几种方式完成。以下步骤适用于支持 NVIDIA GPU 的系统。 自动安装手动安装特定版本PPA安装 1. 自动安装推荐驱动&#xff08;简单方法&#xff0…

java 打印对象所有属性的值 循环

在Java中&#xff0c;如果你想要打印一个对象的所有属性值&#xff0c;可以使用反射&#xff08;Reflection&#xff09;来获取对象的所有字段&#xff0c;并循环遍历这些字段以打印它们的值。以下是一个示例代码&#xff0c;展示了如何实现这一点&#xff1a; 示例类 假设我…

使用argo workflow 实现springboot 项目的CI、CD

文章目录 基础镜像制作基础镜像设置镜像源并安装工具git下载和安装 Maven设置环境变量设置工作目录默认命令最终dockerfile 制作ci argo workflow 模版volumeClaimTemplatestemplatesvolumes完整workflow文件 制作cd argo workflow 模版Workflow 结构Templates 定义创建 Kubern…

Linux各种并发服务器优缺点

本文旨在介绍针对“无并发C/S模型”改进的方法总结以及各种改进方法的优缺点&#xff0c;具体函数的实现并不介绍。 1. 无并发C/S模型 创建服务器流程分析&#xff1a; socket()创建服务器的监听套接字bind()将服务器给服务器的监听套接字绑定IP地址和Port端口号listen()设置…

java虚拟机——频繁发生Full GC的原因有哪些?如何避免发生Full GC

什么是Full GC Full GC&#xff08;Full Garbage Collection&#xff09;是Java垃圾收集过程中的一种形式&#xff0c;它涉及整个堆内存&#xff08;包括年轻代和老年代&#xff09;以及方法区的垃圾收集。Full GC是一个相对重量级的操作&#xff0c;因为它需要遍历和回收整个…

Spring Boot英语知识网站:开发策略

5系统详细实现 5.1 管理员模块的实现 5.1.1 用户信息管理 英语知识应用网站的系统管理员可以对用户信息添加修改删除以及查询操作。具体界面的展示如图5.1所示。 图5.1 用户信息管理界面 5.1.2 在线学习管理 系统管理员可以对在线学习信息进行添加&#xff0c;修改&#xff0…

ASP.NET Web(.Net Framework) Http服务器搭建以及IIS站点发布

ASP.NET Web&#xff08;.Net Framework&#xff09; Http服务器搭建以及IIS站点发布 介绍创建ASP.NET Web &#xff08;.Net Framework&#xff09;http服务器创建项目创建脚本部署Http站点服务器测试 Get测试编写刚才的TestWebController.cs代码如下测试写法1测试写法2 Post测…

快速简单的视频下载器——lux

文章目录 前言1.环境检查1.1 检查 lux 安装1.2 检查FFmpeg安装1.3 备注 2. lux指令2.1 无OPTIONS2.2 -i 指令2.3 - f 指令2.4 -c 指令2.5 -o 指令2.6 备注 3.结语 前言 在学习之余&#xff0c;发现了一个简单并且高效的视频下载器lux,能够帮你快速且高效的下载文件&#xff08…