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

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

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

<!-- 原生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操作,框架能显著提升性能,减少重排和重绘次数。

实战

实现一个简单的双向绑定

<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被触发时更改inputValue
  inputValue.value = event.target.value;
};

//inputValue被更改时更改输入框表单的值
watch(inputValue, (newValue) => {
  document.getElementById('id-input').value = newValue;
});

</script>

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

三六零[601360]行情数据接口

1、三六零&#xff1a;实时行情 Restful API # 测试接口&#xff1a;可以复制到浏览器打开 https://tsanghi.com/api/fin/stock/XSHG/realtime?tokendemo&ticker601360获取股票实时行情&#xff08;开、高、低、收、量&#xff09;。 请求方式&#xff1a;GET。 Python示例…

Xilinx Blockset Gateway In 和Gateway out模块使用及参数配置

目录 一、Gateway InSimulink数据到System Generator数据的转换Gateway BlocksBlock Parameters&#xff08;模块参数&#xff09;Basic选项卡参数Implementation选项卡参数 二、Gateway OutGateway BlocksBlock Parameters&#xff08;模块参数&#xff09;Basic选项卡参数Imp…

三格电子—EtherNet IP转Modbus RTU网关

EtherNet/IP转Modbus RTU网关 SG-EIP-MOD-210 产品用途 SG-EIP-MOD-210网关可以实现将Modbus接口设备连接到 EtherNet/IP网络中。用户不需要了解具体的Modbus和 EtherNet/IP协议即可实现将Modbus设备挂载到 EtherNet/IP接口的PLC上&#xff0c;并和Modbus设备进行数据交互。拓…

使用 Jina Embeddings v2 在 Elasticsearch 中进行后期分块

作者&#xff1a;来自 Elastic Gustavo Llermaly 在 Elasticsearch 中使用 Jina Embeddings v2 模型并探索长上下文嵌入模型的优缺点。 在本文中&#xff0c;我们将配置和使用 jina-embeddings-v2&#xff0c;这是第一个开源 8K 上下文长度嵌入模型&#xff0c;首先使用 semant…

【西瓜书】剪枝与样本值处理——预剪枝、后剪枝、连续值、缺失值

目录 预剪枝 后剪枝 处理连续值 处理缺失值 剪枝&#xff08;pruning&#xff09;是决策树学习算法对付“过拟合”的主要手段。 在决策树学习过程中&#xff0c;有时会造成决策树分枝过多&#xff0c;就可能造成过拟合&#xff0c;可通过主动去掉一些分支来降低过离合的风…

【NLP高频面题 - 分布式训练】ZeRO1、ZeRO2、ZeRO3分别做了哪些优化?

【NLP高频面题 - 分布式训练】ZeRO1、ZeRO2、ZeRO3分别做了哪些优化&#xff1f; 重要性&#xff1a;★★ NLP Github 项目&#xff1a; NLP 项目实践&#xff1a;fasterai/nlp-project-practice 介绍&#xff1a;该仓库围绕着 NLP 任务模型的设计、训练、优化、部署和应用&am…

H3C OSPF 多区域实验

目录 前言 实验拓扑 实验需求 实验解析 路由器配置 测试 前言 此篇文章为 OSPF多区域试验&#xff0c;建议先食用OSPF单区域实验&#xff0c;理解实验原理 学习基本配置&#xff0c;再来使用此篇&#xff0c;效果更佳&#xff01;&#xff08;当然如果你已经了解原理与基…

基于Spring Boot的装饰工程管理系统论文

摘 要 如今社会上各行各业&#xff0c;都喜欢用自己行业的专属软件工作&#xff0c;互联网发展到这个时候&#xff0c;人们已经发现离不开了互联网。新技术的产生&#xff0c;往往能解决一些老技术的弊端问题。因为传统装饰工程项目信息管理难度大&#xff0c;容错率低&#x…

DNS高速缓存污染

DNS高速缓存污染&#xff0c;也称为DNS缓存投毒&#xff0c;是一种网络攻击手段&#xff0c;攻击者通过篡改DNS服务器中的缓存记录&#xff0c;使得用户访问的域名被错误地解析到攻击者控制的IP地址&#xff0c;从而将用户重定向到恶意网站或阻止用户访问目标网站。这种攻击破坏…

一文详解“分治—快排“在算法中的应用

找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a; 优选算法专题 分治算法是利用分而治之的思想来实现的。典型代表&#xff0c;递归&#xff0c;将一个大问题转换为多个与其类似的小问题&#…

【三维生成】Edify 3D:可扩展的高质量的3D资产生成(英伟达)

标题&#xff1a;Edify 3D: Scalable High-Quality 3D Asset Generation 项目&#xff1a;https://research.nvidia.com/labs/dir/edify-3d demo&#xff1a;https://build.nvidia.com/Shutterstock/edify-3d 文章目录 摘要一、前言二、多视图扩散模型2.1.消融研究 三、重建模型…

基于机器视觉的表面缺陷检测

基于机器视觉的表面缺陷检测存在的问题与难点 - AVT相机|AVT红外相机|万兆网相机EVT|VIEWORKS线扫相|映美精相机|Specim多光谱相机|Adimec相机|Basler相机|富士能FUJINON镜头|理光RICOH镜头|OPTO远心镜头|SPO远心镜头|Navtar镜头|VST镜头|CCS光源|3D视觉引导机床上下料系统 (完…

SpringBoot整合MQTT利用EMQX完成消息的发布与接收+Python模拟硬件测试通信

教程说明 本教程主要内容为使用SpringBoot整合MQTT利用EMQX代理服务完成MQTT的消息发送与接收&#xff0c;然后用Python模拟硬件与SpringBoot应用进行了MQTT消息的通信&#xff0c;教程详细&#xff0c;并在最后讲解了开发中的注意事项&#xff0c;本教程适用于物联网领域、Ja…

IntelliJ IDEA 中,自动删除无用导包

在 IntelliJ IDEA 中&#xff0c;自动删除无用导包是一个提升代码整洁性和开发效率的重要功能。以下是实现这一功能的详细步骤&#xff1a; 一、通过快捷键手动删除无用导包 打开Java文件&#xff1a;在IDEA中打开你需要操作的Java文件。 使用快捷键&#xff1a; 在Windows系…

表格数据处理中大语言模型的微调优化策略研究

论文地址 Research on Fine-Tuning Optimization Strategies for Large Language Models in Tabular Data Processing 论文主要内容 这篇论文的主要内容是研究大型语言模型&#xff08;LLMs&#xff09;在处理表格数据时的微调优化策略。具体来说&#xff0c;论文探讨了以下…

如何编写一个 Vue 3 应用:模板插值示例

Vue.js 是一个渐进式的 JavaScript 框架&#xff0c;用于构建用户界面。在本篇博客中&#xff0c;我们将通过一个简单的示例来学习如何使用 Vue 3 创建一个基本的应用。这个示例将展示如何使用 Vue 的模板插值和事件处理来构建一个简单的点击计数器。 步骤 1: 准备工作 首先&…

基于混合ABC和A*算法复现

基于混合ABC和A*算法复现 一、背景介绍二、算法原理&#xff08;一&#xff09;A*算法原理&#xff08;二&#xff09;人工蜂群算法原理&#xff08;三&#xff09;混合ABC和A*算法策略 三、代码实现&#xff08;一&#xff09;数据准备&#xff08;二&#xff09;关键函数实现…

2024 APMCM亚太数学建模C题 - 宠物行业及相关产业的发展分析和策略(详细解题思路)

在当下&#xff0c; 日益发展的时代&#xff0c;宠物的数量应该均为稳步上升&#xff0c;在美国出现了下降的趋势&#xff0c; 中国 2019-2020 年也下降&#xff0c;这部分变化可能与疫情相关。需要对该部分进行必要的解释说明。 问题 1: 基于附件 1 中的数据及您的团队收集的额…

鸿蒙MVVM模式介绍与使用

文章目录 鸿蒙MVVM模式介绍与使用背景MVVM模式介绍相关装饰器介绍State状态变量Prop、Link的作用 MVVM架构模式的实现以及相关装饰器的使用具体实现效果 总结 鸿蒙MVVM模式介绍与使用 背景 最近在学习鸿蒙开发,想到了以前写安卓移动端应用时经常会用到的MVVM架构模式,就想着能…

Jmeter测试工具的安装和使用,mac版本,jmeter版本5.2.1

Jmeter测试工具的安装和使用JSON格式请求 一、安装1、安装jdk包和设置java环境2、去官网下载Jmeter3、解压后&#xff0c;打开mac终端&#xff0c;进入apache-jmeter的bin文件开启jmeter 二、使用jmeter1、添加线程2、添加HTTP请求3、配置请求的协议、IP地址、端口号、请求方法…