vue面试题-应用层

  • MVC与MVVM
    • MVC
    • MVVM
  • 双向数据绑定
    • vue2 双向绑定原理
      • v-model原理
    • vue3 双向绑定原理
      • 示例
    • 对比 vue2响应式原理和Vue3响应式原理
  • data为什么是函数?
  • v-if 与 v-show

MVC与MVVM

MVC和MVVM是两种流行的设计模式,它们都是用于构建动态应用程序的框架。

MVC

MVC,全称Model-View-Controller,是一种软件设计模式,通常用于构建用户界面。

在MVC模式中,模型(Model)负责管理应用程序的数据和业务逻辑,视图(View)负责呈现数据给用户,控制器(Controller)处理用户的输入并更新模型和视图。

MVC的主要优点是它实现了视图和模型的分离,允许开发者在不改变数据的情况下更新用户界面

MVVM

MVVM,全称Model-View-ViewModel,是MVC的衍生品,也称为MVC的增强版。

在MVVM中,有一个额外的层次,即 视图模型(ViewModel)

视图模型在视图和模型之间进行数据绑定,避免了在MVC中直接在视图和模型之间进行交互。

这使得视图和模型之间的耦合度更低,更便于维护和测试。

综上所述,MVC和MVVM的主要区别在于是否有视图模型这一层

MVC模式中,视图和模型之间的耦合度较高,而在MVVM中,通过视图模型降低了视图和模型之间的耦合度。

双向数据绑定

vue2 双向绑定原理

在 Vue 2 中,双向绑定是通过使用 Object.defineProperty 来实现的。下面是 Vue 2 中双向绑定的原理:

  1. 初始化:当创建一个 Vue 实例时,Vue 会将 data 对象中的属性转化为访问器属性,并使用 Object.defineProperty 进行定义。

  2. 数据劫持:在定义属性时,Vue 会在 getter 和 setter 中添加额外的逻辑。当访问属性时,getter 会被触发,Vue 会进行依赖收集,将正在访问的对象和属性关联起来。当修改属性值时,setter 会被触发,Vue 会通知相关的地方进行更新。

  3. 依赖追踪:Vue 会通过维护一个依赖列表来追踪属性的依赖关系。每个属性都有一个对应的 Watcher 对象,用于管理与该属性相关的依赖和更新。

  4. 响应式更新:当响应式对象的属性发生改变时,Vue 会通知与该属性相关的 Watcher 对象进行更新操作。这是通过调用 Watcher 对象的 update 方法来实现的。

  5. 批量更新:为了提高性能,Vue 2 会将多次属性的修改合并到一个批量更新中。这样可以避免不必要的重复计算和更新操作。

  6. 视图更新:一旦数据发生变化,Vue 会自动将变化应用到相关的视图上,使其保持同步。Vue 2 使用虚拟 DOM 和 diff 算法来实现视图更新,只更新发生变化的部分,并尽量减少实际的 DOM 操作。

综上所述,Vue 2 的双向绑定原理可以归纳为以下几个步骤:初始化数据 -> 数据劫持 -> 依赖追踪 -> 响应式更新 -> 批量更新 -> 视图更新

这种基于 Object.defineProperty 的双向绑定机制让 Vue 2 能够自动追踪数据的变化并将其同步到视图中。

v-model原理

v-model是Vue.js中的双向绑定指令,它可以将页面上控件输入的值同步更新到相关绑定的data属性,也会在更新data绑定属性时更新页面上输入控件的值。

v-model的原理: Object.defineProperty

是通过模板中的v-model指令绑定元素属性,当用户在元素中输入内容时,该属性的value值会被更新并触发 oninput事件

Vue.js监听元素oninput事件,通过新旧值的比较来确定数据是否发生变化,实现数据的双向绑定

如果用户在元素中按下回车键或者失去焦点,则该元素的onchange事件也会触发。

Vue.js同样监听元素onchange事件,并在事件处理函数中将元素值同步到Vue实例中。

使用v-model可以非常方便地实现数据和视图的双向绑定,提高前端开发效率。

vue3 双向绑定原理

Vue 3 使用了一种名为“基于 Proxy 的响应式系统”的双向绑定原理。

在 Vue 2 中,双向数据绑定是通过使用 Object.defineProperty 来实现的,但这种方法在性能和灵活性方面存在一些限制。而基于 Proxy 的响应式系统则提供了更好的性能和更灵活的特性。

下面是 Vue 3 中双向绑定的原理:

  1. 初始化:当创建一个 Vue 实例时,Vue 会对数据进行初始化,并使用 Proxy 对其进行包装。Proxy 是 ES6 提供的一个功能强大的对象拦截器,可以拦截对象的各种操作。

  2. 依赖追踪:在 Vue 3 中,每当你访问一个响应式对象的属性时,Vue 会自动追踪该属性的依赖关系。这是通过在访问属性时,将正在访问的对象和属性关联起来来实现的。

  3. 响应式更新:当响应式对象的属性发生变化时,Vue 会自动通知依赖于该属性的地方进行更新。这是通过 Proxy 拦截器中的 set 方法来实现的,在属性被修改时触发更新操作。

  4. 批量更新:为了提高性能,Vue 3 会将多次属性的修改合并到一个批量更新中。这可以避免不必要的重复计算和更新操作。

  5. 视图更新:一旦数据发生变化,Vue 会自动将变化应用到相关的视图上,使其保持同步。这是通过虚拟 DOM 和 diff 算法来实现的,只更新发生变化的部分,并尽可能地减少实际的 DOM 操作。

Vue 3 的双向绑定原理可以归纳为以下几个步骤:初始化数据 -> 追踪依赖 -> 监测属性修改 -> 批量更新 -> 视图更新。这种基于 Proxy 的响应式系统让 Vue 3 在性能和灵活性方面都有显著的提升。

示例

当你在 Vue 3 中创建一个响应式对象并进行双向绑定时,Vue 会使用基于 Proxy 的响应式系统来实现数据的自动更新。下面是一个具体的示例:

<template><div><input v-model="message" /><p>{{ message }}</p></div>
</template><script>
import { reactive } from 'vue';export default {setup() {// 创建响应式对象const data = reactive({message: 'Hello, Vue 3!',});return {message: data.message,};},
};
</script>

在上面的代码中,我们创建了一个包含 message 属性的响应式对象 data。然后,我们将 data.message 绑定到输入框的值通过 v-model 指令,并同时使用 {{ message }} 表达式将 message 展示在 <p> 标签中。

当你在输入框中修改文本时,Vue 3 会自动更新 data.message 的值,因为它是一个响应式对象。接着,Vue 会自动将新的值更新到展示 message 的地方。

这里的双向绑定是通过 Vue 3 的响应式系统实现的。当你修改输入框中的文本时,Vue 会拦截这次修改并触发 data.message 的更新,然后更新视图。同样地,如果你在其他地方修改了 data.message 的值,相关的视图也会自动更新。

这个例子展示了 Vue 3 中双向绑定的原理,它是通过基于 Proxy 的响应式系统来实现的。通过创建响应式对象和使用 v-model 指令,你可以轻松地实现数据在视图和模型之间的双向同步。

对比 vue2响应式原理和Vue3响应式原理

Vue 2和Vue 3的响应式原理有所不同。

以下是它们的主要区别:

Vue 2的响应式原理:

  1. 在Vue 2中,Vue实例会在初始化过程中 对数据对象进行递归地遍历 ,使用Object.defineProperty方法将对象的属性转换为getter和setter。
  2. 当访问或修改这些属性时,Vue会通过getter和setter来追踪属性的依赖关系。
  3. Vue会为每个属性维护一个依赖收集器,用于跟踪属性依赖的Watcher对象。
  4. 当属性发生变化时,Vue会通知相应的Watcher对象,然后Watcher对象触发视图的更新。

Vue 3的响应式原理:

  1. 在Vue 3中,使用了 ES6的Proxy API 来实现响应式系统,该API提供了更强大和灵活的拦截器功能。
  2. 当创建一个Vue 3实例时,Vue会使用Proxy包装数据对象,并拦截对数据的访问和修改操作。
  3. 当访问数据时,Proxy会自动追踪访问的依赖关系,并建立相应的反向依赖关系。
  4. 当数据发生变化时,Proxy会自动触发相应的依赖更新,从而更新相关的组件或视图。

需要注意的是,Vue 3的Proxy API相对于Vue 2的Object.defineProperty具有更好的性能,并且能够更精确地追踪属性变化。

此外,Vue 3还引入了一些优化措施,例如基于树的依赖跟踪和批量更新,以进一步提高响应式系统的性能。

data为什么是函数?

  • 闭包设计 =>每一个组件都有自己的私有作用域,确保各组件数据不会相互干扰
  • 纯对象 => 干扰 let oj = 0

v-if 与 v-show

  • v-if:不满足条件,不会谊染dom => 单次判断
  • v-show: 隐dom => 多次切换,(不能用于权限操作)

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

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

相关文章

c++可变参数模板

不要做一个清醒的堕落者文章目录 可变参数模板的简介什么是可变参数 模板参数包参数包数据的获取(函数递归获取)参数包的获取(逗号表达式获取) 可变参数的应用emplace 可变参数模板的简介 c11添加的新特性能够让你创建可以接受改变的函数模板和类模板&#xff0c;C98/03&#…

LCR 095. 最长公共子序列(C语言+动态规划)

1. 题目 给定两个字符串 text1 和 text2&#xff0c;返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 &#xff0c;返回 0 。 一个字符串的 子序列 是指这样一个新的字符串&#xff1a;它是由原字符串在不改变字符的相对顺序的情况下删除某些字符&#xff08…

权限管理与jwt鉴权

权限管理与jwt鉴权 学习目标&#xff1a; 理解权限管理的需求以及设计思路实现角色分配和权限分配 理解常见的认证机制 能够使用JWT完成微服务Token签发与验证 权限管理 需求分析 完成权限&#xff08;菜单&#xff0c;按钮&#xff08;权限点&#xff09;&#xff0c;A…

最详细STM32,cubeMX 按键点亮 led

这篇文章将详细介绍 如何在 stm32103 板子上使用 按键 点亮一个LED. 文章目录 前言一、如何控制按键&#xff1f;为什么按键要接上拉电阻或者下拉电阻呢&#xff1f; 二、cubeMX配置工程自动生成代码解析 三、读取引脚电平函数四、按键为什么要消抖如何消除消抖 五、实现按键控…

电子笔记真的好用吗?手机上适合记录学习笔记的工具

提及笔记&#xff0c;不少人都会和学习挂钩&#xff0c;的确学习过程中我们经常会遇到很多难题&#xff0c;而经常记录笔记可以有效地帮助大家记住很多知识&#xff0c;而且时常拿出笔记查看一下&#xff0c;可方便巩固过去学习的知识。 手机作为大家日常随身携带的工具&#…

idea 启动出现 Failed to create JVM JVM Path

错误 idea 启动出现如下图情况 Error launching IDEA If you already a 64-bit JDK installed, define a JAVA_HOME variable in Computer > System Properties> System Settings > Environment Vanables. Failed to create JVM. JVM Path: D:\Program Files\JetB…

[软考中级]软件设计师-uml

事物 uml中有4中事物&#xff0c;结构事物&#xff0c;行为事物&#xff0c;分组事物和注释事物 结构事物是uml模型中的名词&#xff0c;通常是模型的静态部分&#xff0c;描述概念或物理元素 行为事物是uml的动态部分&#xff0c;是模型中的动词&#xff0c;描述了跨越时间…

appium---如何判断原生页面和H5页面

目前app中存在越来越多的H5页面了&#xff0c;对于一些做app自动化的测试来说&#xff0c;要求也越来越高&#xff0c;自动化不仅仅要支持原生页面&#xff0c;也要可以H5中进行操作自动化&#xff0c; webview是什么 webview是属于android中的一个控件&#xff0c;也相当于一…

快手新版本sig3参数算法还原

Frida Native层主动调用 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81…

C++之委托构造函数实例(二百四十三)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

【每日一句】只出现一次的数

文章目录 Tag题目来源题目解读解题思路方法一&#xff1a;位运算 其他语言Cpython3 写在最后 Tag 【位运算-异或和】【数组】【2023-10-14】 题目来源 136. 只出现一次的数字 题目解读 给你一个数组&#xff0c;找出数组中只出现一次的元素。题目保证仅有一个元素出现一次&a…

[华为杯研究生创新赛 2023] 初赛 REV WP

前言 一年没打比赛了, 差一题进决赛, REV当时lin的第三个challenge没看出来是凯撒, 想得复杂了, 结果错失一次线下机会 >_< T4ee 动态调试, nop掉反调试代码 发现处理过程为 置换sub_412F20处理(这里看其他师傅的wp知道应该是rc4, 我是直接en逆的buf字符串中每一位和…

竞赛 深度学习+opencv+python实现昆虫识别 -图像识别 昆虫识别

文章目录 0 前言1 课题背景2 具体实现3 数据收集和处理3 卷积神经网络2.1卷积层2.2 池化层2.3 激活函数&#xff1a;2.4 全连接层2.5 使用tensorflow中keras模块实现卷积神经网络 4 MobileNetV2网络5 损失函数softmax 交叉熵5.1 softmax函数5.2 交叉熵损失函数 6 优化器SGD7 学…

【网安必读】CTF/AWD实战速胜指南《AWD特训营》

文章目录 前言&#x1f4ac;正文这本书好在哪❔这本书讲了什么❔文末送书 前言&#x1f4ac; 【文末送书】今天推荐一本网安领域优质书籍《AWD特训营》&#xff0c;本文将从其内容与优势出发&#xff0c;详细阐发其对于网安从业人员的重要性与益处。 正文 &#x1f52d;本书…

《论文阅读:Dataset Condensation with Distribution Matching》

点进去这篇文章的开源地址&#xff0c;才发现这篇文章和DC DSA居然是一个作者&#xff0c;数据浓缩写了三篇论文&#xff0c;第一篇梯度匹配&#xff0c;第二篇数据增强后梯度匹配&#xff0c;第三篇匹配数据分布。DC是匹配浓缩数据和原始数据训练一次后的梯度差&#xff0c;DS…

idea怎么设置作者信息(详细)

目录 一&#xff1a;在Java类的开头自动注释作者名字和日期等信息 二&#xff1a;给Java的方法注释作者名字和日期等信息 1. 不可修改的模板&#xff1a;Postfix Completion 2. 可修改的模板&#xff1a;Live Templates tips&#xff1a;首先给大家推荐两款好用的免费软件&…

一文就懂大语言模型Llama2 7B+中文alpace模型本地部署

大语言模型Llama2 7B中文alpace模型本地部署 VX关注晓理紫并回复llama获取推理模型 [晓理紫] 1、Llama模型 一个由facebook发布的生成式语言模型&#xff0c;具体可以到其官方了解。 为了大家更好理解&#xff0c;这里把目录结构显示下一如下图。 2、 下载Llama并配置环境 …

Openstack部署

搭建基础环境 #网络 #防火墙 #用户用 #解析 #同步时间 实验角色 OpenStack01OpenStack02OpenStack03192.168.1.101192.168.1.102192.168.1.103srv1srv2srv3 同步时间 [rootsrv1]# yum install chrony -y [rootsrv1]# vim /etc/chrony.conf # 修改第3行&#xff0c;将NT…

为Mkdocs网站添加评论系统(以giscus为例)

官方文档&#xff1a;Adding a comment system 这里我同样推荐giscus 利用 GitHub Discussions 实现的评论系统&#xff0c;让访客借助 GitHub 在你的网站上留下评论和反应吧&#xff01;本项目深受 utterances 的启发。 开源。&#x1f30f;无跟踪&#xff0c;无广告&#…

灾备建设中的网络传输

对于建设灾备系统&#xff0c;只要是网络可达即可进行数据备份保护。灾备中用的传输方式有很多种&#xff0c;比如网络传输&#xff0c;lan-free传输&#xff0c;网络加密传输等。 在这里给大家介绍下网络传输&#xff0c;灾备中的网络传输和平时大家熟知的是一样的。是指用一…