浏览器漫谈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被触发时更改inputValueinputValue.value = event.target.value;
};//inputValue被更改时更改输入框表单的值
watch(inputValue, (newValue) => {document.getElementById('id-input').value = newValue;
});</script>

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

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

相关文章

Python 爬虫 (1)基础 | 目标网站

一、目标网站 1、加密网站 1.1、关键字比较明确 企名片&#xff1a;https://wx.qmpsee.com/articleDetail?idfeef62bfdac45a94b9cd89aed5c235be 1.2、关键字比较泛 烯牛数据&#xff1a;https://www.xiniudata.com/project/event/lib/invest

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

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

堆优化版本的Prim

prim和dijkstra每轮找最小边的松弛操作其实是同源的&#xff0c;因而受dijkstra堆优化的启发&#xff0c;那么prim也可以采用小根堆进行优化。时间复杂度也由 O ( n 2 ) O(n^2) O(n2)降为 O ( n l o g n ) O(nlogn) O(nlogn)。 测试一下吧&#xff1a;原题链接 #include <i…

研0找实习【学nlp】15---我的后续,总结(暂时性完结)

当下进展成果&#xff1a; nlptransformerpytorchhuggingfacebert简历环境配置表情识别文本分类 断更了快1个月&#xff0c;2个礼拜找实习&#xff0c;1个礼拜伤心&#xff0c;1个礼拜想我要干什么…… 承认自己的才疏学浅&#xff0c;了解了leetcode&#xff0c;和老师商量了…

HTML5和CSS3新增特性

HTML5的新特性 HTML5新增的语义化标签 HTML5 的新增特性主要是针对于以前的不足&#xff0c;增加了一些新的标签、新的表单和新的表单属性等。 这些新特性都有兼容性问题&#xff0c;基本是 IE9 以上版本的浏览器才支持&#xff0c;如果不考虑兼容性问题&#xff0c;可以大量…

width设置100vh但出现横向滚动条的问题

在去做flex左右固定,中间自适应宽度的布局时, 发现这样一个问题: 就是我明明是宽度占据整个视口, 但是却多出了横向的滚动条 效果是这样的 把width改成100%,就没有滚动条了 原因: body是有默认样式的, 会有一定的默认边距, 把默认边距清除就是正常的了 同时, 如果把高度设…

EasyExcel: 结合springboot实现表格导出入(单/多sheet), 全字段校验,批次等操作(全)

全文目录,一步到位 1.前言简介1.1 链接传送门1.1.1 easyExcel传送门 2. Excel表格导入过程2.1 easyExcel的使用准备工作2.1.1 导入maven依赖2.1.2 建立一个util包2.1.3 ExcelUtils统一功能封装(单/多sheet导入)2.1.4 ExcelDataListener数据监听器2.1.5 ResponseHelper响应值处理…

数字ic设计bug:寄存器翻转错误

数字ic设计bug&#xff1a;寄存器翻转错误 bug场景&#xff1a; 寄存器未按指定条件翻转&#xff0c;满足翻转条件&#xff0c;但未翻转 问题描述 always&#xff08;posedge clk or negedge rst_n&#xff09; if(!rst_n)a < 1‘d0; else if(a_condition)a < 1’b1;a…

Linux/Windows/OSX 上面应用程序重新启动运行。

1、Linux/OSX 上面重新运行程序&#xff0c;直接使用 execvp 函数就可以了&#xff0c;把main 函数传递来的 argv 二维数组&#xff08;命令行参数&#xff09;传进去就可以&#xff0c;注意不要在 fork 出来的子进程搞。 2、Windows 平台可以通过 CreateProcess 函数来创建新的…

css:转换

转换 移动 /* transform: translate(100px, 200px); */transform: translateX(100px);transform: translateY(100px); /*一个意思*/ 如果后面跟百分数的意思是移动盒子自身x/y方向长度的百分比&#xff0c;可以用作子绝父相控制盒子水平居中垂直居中 translate里的xy值是相对…

java大视频分片上传

实现原理&#xff0c;前端控制每次上传1mb&#xff0c;后端接受1mb&#xff0c;并记录该分片下标&#xff0c;返回给前端还未上传的下标&#xff0c;直到所有的都上传完成 controller ApiOperation(value "上传视频", notes "上传视频", httpMethod &…

量化交易系统开发-实时行情自动化交易-4.4.1.做市策略实现

19年创业做过一年的量化交易但没有成功&#xff0c;作为交易系统的开发人员积累了一些经验&#xff0c;最近想重新研究交易系统&#xff0c;一边整理一边写出来一些思考供大家参考&#xff0c;也希望跟做量化的朋友有更多的交流和合作。 接下来继续说说做市策略实现。 做市策…

webp 网页如何录屏?

工作中正好研究到了一点&#xff1a;记录下这里&#xff1a; 先看下效果&#xff1a; 具体实现代码&#xff1a; &#xfeff; <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…

C#中面试的常见问题005

1、重载和重写 重载&#xff08;Overloading&#xff09; 重载是指在同一个类中定义多个同名方法&#xff0c;但参数列表不同&#xff08;参数的数量、类型或顺序不同&#xff09;。返回类型可以相同也可以不同。重载方法允许你根据传入的参数类型和数量来调用不同的方法。 …

CTF之密码学(BF与Ook)

BrainFuck&#xff08;通常也被称为Brainfuck或BF&#xff09;和Ook是两种非常特殊且有趣的编程语言。以下是对这两种语言的详细介绍&#xff1a; 一、BrainFuck 简介&#xff1a; BrainFuck是一种极小化的计算机语言&#xff0c;由Urban Mller在1993年创建。由于“fuck”在英…

SpringCloud Gateway转发请求到同一个服务的不同端口

SpringCloud Gateway默认不支持将请求路由到一个服务的多个端口 本文将结合Gateway的处理流程&#xff0c;提供一些解决思路 需求背景 公司有一个IM项目&#xff0c;对外暴露了两个端口8081和8082&#xff0c;8081是springboot启动使用的端口&#xff0c;对外提供一些http接口…

MySQL 数据库连接池爆满问题排查与解决

目录 MySQL 数据库连接池爆满问题排查与解决 一、问题影响 二、问题确认 三、收集信息 四、SQL 语句分析 五、应用层代码分析 六、连接池配置检查 七、监控工具使用 八、案例分析 在实际的应用开发中&#xff0c;我们可能会遇到 MySQL 数据库连接池爆满的情况。这种情…

解决发布web接口时数据无法JSON化的问题

解决HTTP接口传输中的JSON序列化问题 引言 当涉及到复杂的数据类型时&#xff0c;如浮点数、Numpy数组、pandas等&#xff0c;直接使用Python的json模块进行序列化可能会遇到问题。本文将解决这些问题&#xff0c;并提供一个通用的方案&#xff0c;确保数据能够顺利地通过HTT…

SlickGrid复选框

分析 1、先在columns首列添加复选框&#xff1b; 2、在SlickGrid注册刚添加的复选框&#xff1b; 3、添加复选框变化事件&#xff1b; 4、注册按钮点击事件&#xff0c;点击获取已选中的行。 展示 代码 复选框样式&#xff08;CSS&#xff09; .slick-cell-checkboxsel {bac…

摄像头原始数据读取——V4L2(userptr模式,V4L2_MEMORY_USERPTR)

摄像头原始数据读取——V4L2(userptr模式,V4L2_MEMORY_USERPTR) 用户指针方式允许用户空间的应用程序分配内存&#xff0c;并将内存地址传递给内核中的驱动程序。驱动程序直接将数据填充到用户空间的内存中&#xff0c;从而避免了数据的拷贝过程。 流程&#xff1a; 通过VIDI…