前端面试题——Vue的双向绑定

前言

双向绑定机制是Vue中最重要的机制之一,甚至可以说是Vue框架的根基,它将数据与视图模板相分离,使得数据处理和页面渲染更为高效,同时它也是前端面试题中的常客,接下来让我们来了解什么是双向绑定以及其实现原理。

什么是双向绑定

vue的双向绑定,即数据与视图的响应式设计。具体表现为:View 的改变能实时让Model发生变化,而 Model 的变化也能实时更新 View。而单项数据绑定,所有数据只有一份,一旦数据变化,就去更新页面(只有data-->DOM,没有DOM-->data)。

总之,所谓双向绑定,指的是 Vue 实例中的 data 与其渲染的 DOM 元素的内容保持一致,无论谁被改变,另一方会相应的更新为相同的数据。

使用双向绑定(v-model)

Vue2

<template><div id="app"><input type="text" v-model="message"><p>{{message}}</p></div>
</template>
<script>
export default {data() {return {message: "Hello, Vue2!"};}};
</script>

Vue3

<template><div id="app"><input type="text" v-model="message"><p>{{message}}</p></div>
</template>
<script>
import { ref } from "vue";export default {setup() {const message= ref("Hello, Vue 3!");return { message};}};
</script>

注意,Vue双向绑定的对象一定要是响应式的。

双向绑定的原理

实现模式

Vue双向数据绑定是通过数据劫持+发布订阅者模式来实现的。Vue 采用的是 MVVM 架构,实现 MVVM 主要包含两个方面,一是数据变化更新视图,二是试图变化更新数据。 在实现过程上来说,主要有四个模块:

  • 监听器Observer:执行劫持监听的所有属性,如果属性发生变化了,就通知订阅者Watcher看是否需要更新。
  • 订阅者Watcher:可以受到属性的变化通知并执行相应的函数,从而更新视图。
  • 消息订阅器Dep:因为订阅者有很多个,所以需要一个消息订阅器Dep来专门收集这些订阅者,然后在监听器Observer和订阅者Watcher之间进行统一管理。
  • 解析器Compile:可以扫描和解析每个节点的相关指令,并根据初始化模板数据以及初始化相应的订阅器。

Vue2与Vue3绑定模式的实现差异

需要注意的是虽然Vue2与Vue3都采用了数据劫持+发布订阅者的模式,但二者的实现原理有所不同:

  • Vue2是通过 ES5 提供的 Object-defineProperty() 方法来劫持(监听)各属性的 getter、setter,并在当监听的属性发生变动时通知订阅者,是否需要更新,若更新就会执行对应的更新函数。
  • Vue3加入ES2015中新增的 Proxy() 代替了原本的 Object.defineProperty()。

Vue3为什么弃用了ObjectdefineProperty选择了Proxy

  • Proxy() 可以拦截数组和对象的变化。而 Object.defineProperty() 只能拦截对象属性的变化。
  • 相较于 Object.defineProperty() 劫持某个属性,Proxy() 则更彻底,不在局限某个属性,而是直接对整个对象进行代理。
  • Proxy能够监听到对象属性的增加、删除。
  • Object.defineProperty() 不能对 ES6 新产生的 Map 、Set 这样的数据结构进行监听。
  • Object.defineProperty() 无法监控到数组下标的变化,导致通过数组下标添加元素不能实时响应。

手写 Object.defineProperty() 双向数据绑定

<div>展示:<h1></h1>输入: <input type="text">
</div><script>// 创建definePropertyFn来挟持数据function definePropertyFn() {let obj = {}let val = nullObject.defineProperties(obj, {val: {get() {return val},set(newV) {val = newV// 数据控制视图 将更改的数据赋值给h1document.querySelector('h1').innerText = newVconsole.log('调用了set,获取:' + newV, val);}}})return obj}let newObj = definePropertyFn()document.querySelector('h1').innerText = newObj.val // 调用了get,执行数据渲染视图document.querySelector('input').value = newObj.val // 调用了get,执行数据渲染视图// 下面监听视图 input 标签,标签一变动,将最新数据获取调用set,赋值给val,并且赋值给h1document.querySelector('input').addEventListener('input', function () {newObj.val = document.querySelector('input').value})
</script>

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

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

相关文章

笔记本电脑的WIFI模块,突然不显示了,网络也连接不上

问题复现&#xff1a; 早上&#xff0c;在更新完笔记本电脑的系统之后&#xff0c;连网之后&#xff0c;网络突然直接断开&#xff0c;一查看&#xff0c;WiFi模块居然不见了&#xff0c;开机重启也是如此&#xff0c;这种情况常常出现在更新系统之后&#xff0c;WiFi模块驱动就…

hdfs datanode数据分布不均调整(hdfs balancer )

Hadoop集群Datanode数据倾斜&#xff0c;个别节点hdfs空间使用率达到95%以上&#xff0c;于是新增加了三个Datenode节点&#xff0c;由于任务还在跑&#xff0c;数据在不断增加中&#xff0c;这几个节点现有的200GB空间估计最多能撑20小时左右&#xff0c;所以必须要进行balanc…

【Elasticsearch】从入门到精通

目前java常见的针对大数据存储的方案并不多&#xff0c;常见的就是mysql的分库分表、es存储 这里偏向es存储方案&#xff0c;es不同的版本之间其实差异还挺大的&#xff0c;本篇博文版本Elasticsearch 7.14.0 Springboot整合Easy-Es Easy-Es官方文档 Elasticsearch的初步认识 …

【操作系统·考研】磁盘和固态磁盘

1.磁盘 1.1 概述 磁盘(Disk)是由表明涂有磁性物质的物理盘片&#xff0c;通过一个称为磁头的导体线圈从磁盘存取数据。 在读/写期间&#xff0c;磁头固定&#xff0c;下面的磁盘在高速旋转。 磁盘是可共享设备(分时共享)&#xff0c;是指某段时间内可以有多个用户进行访问&a…

Sklearn、TensorFlow 与 Keras 机器学习实用指南第三版(六)

原文&#xff1a;Hands-On Machine Learning with Scikit-Learn, Keras, and TensorFlow 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 第十四章&#xff1a;使用卷积神经网络进行深度计算机视觉 尽管 IBM 的 Deep Blue 超级计算机在 1996 年击败了国际象棋世界冠军…

从零开始 TensorRT(4)命令行工具篇:trtexec 基本功能

前言 学习资料&#xff1a; TensorRT 源码示例 B站视频&#xff1a;TensorRT 教程 | 基于 8.6.1 版本 视频配套代码 cookbook 参考源码&#xff1a;cookbook → 07-Tool → trtexec 官方文档&#xff1a;trtexec 在 TensorRT 的安装目录 xxx/TensorRT-8.6.1.6/bin 下有命令行…

Linux Shell命令系列--basename获取基本文件名

一、目的 学习linux shell编程的第一步就是熟悉linux的各种命令的使用&#xff0c;本篇开始逐次介绍一些常用linux shell命令。 今天我们来讲解basename命令的使用。 二、介绍 1、基本概念 basename命令首先去除字符串末尾多余的斜杠&#xff08;如果有的话&#xff09;&#…

Java代码实现基数排序算法(附带源码)

基数排序是一种非比较型整数排序算法&#xff0c;其原理是将整数按位数切割成不同的数字&#xff0c;然后按每个位数分别比较。由于整数也可以表达字符串&#xff08;比如名字或日期&#xff09;和特定格式的浮点数&#xff0c;所以基数排序也不是只能使用于整数。 1. 基数排序…

STC系列单片机的中断系统

目录 一、中断系统的定义 二、STC15系列单片机的中断请求源及结构图 三、中断查询表以及触发方式 四、在keil c中如何声明中断函数 五、外部中断 六、基于STC15芯片实战中断系统的使用 &#xff08;1&#xff09;外部中断2/外部中断3来检测门的开关状态 &#xff08;2&a…

合并分支rebase和merge的区别

文章目录 一、前言1.1、master分支1.2、dev分支 二、合并2.1、git merge2.2、git rebase 三、总结四、最后 一、前言 实际开发工作的时候&#xff0c;我们都是在自己的分支开发&#xff0c;然后将自己的分合并到主分支&#xff0c;那合并分支用2种操作&#xff0c;这2种操作有…

工信部颁发的《计算机视觉处理设计开发工程师》中级证书

计算机视觉&#xff08;Computer Vision&#xff09;是一门研究如何让计算机能够理解和分析数字图像或视频的学科。简单来说&#xff0c;计算机视觉的目标是让计算机能够像人类一样对视觉信息进行处理和理解。为实现这个目标&#xff0c;计算机视觉结合了图像处理、机器学习、模…

数据安全加密系统的核心目的是什么

随着信息化时代的快速发展&#xff0c;数据安全问题逐渐成为人们关注的焦点。数据一旦被非法获取或篡改&#xff0c;可能会给个人、企业甚至国家带来巨大的损失。因此&#xff0c;构建一个高效的数据安全加密系统&#xff0c;是确保数据安全的重要手段。 数据安全加密系统的核心…