vue面试题-原理层

news2024/10/6 18:31:44
  • 虚拟dom
    • 虚拟dom是什么?
    • 虚拟dom在vue中做了什么?
      • vue 渲染两条线
    • 虚拟dom是如何提升vue的渲染效率的?
      • 局部更新节点数据
      • 将直接操作dom的地方拿到两个js对象之中去做比较
    • 虚拟dom生成三要素
      • 节点类型/目标元素 [必须有]
      • 节点属性
      • 子节点
  • Diff中的patch

虚拟dom

虚拟dom是什么?

  • a.vue2x 才有虚拟dom
  • b.本质 js对象 =>跨平台

虚拟dom在vue中做了什么?

vue 渲染两条线
  • 1.首次渲染:将真实dom转化虚拟dom (js对象)
  • 2.后续更新:更新的时候做对比

vue的渲染过程 (htm1,css,js)

<template>
  <ul>
    <li>1</li>
    <li>2</li>
    <li>3</li>
  </ul>
</template>

虚拟dom是如何提升vue的渲染效率的?

vue 特点

  • 组件化
  • 数据去驱动
局部更新(节点数据)
将直接操作dom的地方拿到两个js对象之中去做比较

虚拟dom生成三要素

虚拟 DOM (Virtual DOM) 是一种编程概念,它是在用户界面更新过程中用于跟踪和最小化必要的更改的技术。

节点类型/目标元素 [必须有]
节点属性
子节点

在生成虚拟 DOM 时,以下是三个主要要素:

  1. 节点类型/目标元素:在虚拟 DOM 中,每个节点都有一个特定的类型。这可能是元素节点(如 <div>, <span> 等)、文本节点(如文本内容)或组件节点(如自定义组件)。节点类型决定了如何渲染和更新该节点。
  2. 节点属性:每个节点都有一组属性,这些属性定义了节点的外观和行为。例如,元素节点可能有类名、样式、事件处理器等属性。这些属性在虚拟 DOM 中以键值对的形式存储,可以在不改变底层 DOM 结构的情况下进行修改和更新。
  3. 子节点:每个节点可能有一个或多个子节点,这些子节点可以是其他元素、文本或组件节点。在虚拟 DOM 中,子节点的顺序和数量都是重要的,因为它们决定了渲染的结果。

让我们通过一个简单的例子来理解这三个要素:

假设我们有一个简单的 HTML 元素——一个包含文本的 <div> 元素。

<div id="myDiv">Hello, World!</div>

在虚拟 DOM 中,这将被表示为一个节点对象,其中包含以下三个要素:

  1. 节点类型/目标元素:这是一个元素节点,类型为 <div>
  2. 节点属性:该节点有一个 id 属性,值为 "myDiv"
  3. 子节点:该节点有一个文本子节点,内容为 "Hello, World!"

现在,如果我们想更新这个 <div> 元素的内容,我们不需要直接操作 DOM。相反,我们可以更新虚拟 DOM,然后让库或框架将更改应用到实际的 DOM。例如,我们可以将文本更改为 "Hello, Virtual DOM!"。在虚拟 DOM 中,这将表现为子节点的更改。

虚拟 DOM 使得我们能够以更加可预测和高效的方式更新用户界面,尤其是在处理复杂的应用程序和频繁的更新时。

Diff中的patch


// 1.初始化 patch(container,vnode)
// 2.更新 update(vnode, newVnode)

// 初始化流程
function createElement(vnode){
  let tag = vnode.tag // 目标元素 ul
  let attrs = vnode.attrs || {}  // 属性
  let children = vnode.children || [] // 子节点

  if(!tag) {
    return null
  }

  // 1.创建对应的dom
  let elem = document .createElement(tag)
 

  // 2.给dom添加属性
   let attrName
  for(attrName in attrs){
   if(attrs.hasOwnProperty(attrName)){
      // class
      elem.setAttribute(attrName, attrs[attrName])
   } 
  }

  // 3.将子元素添加到目标之上
  children.forEach((childVnode)=>{
    elem.appendChild(createElement(childVnode))
  })

  return elem
}

// 更新流程
function updateChildren(vnode, newVnode){
  let children = vnode.children || [] // 现有节点
  let newChildren = newVnode.children || [] // 新节点

  children.forEach((childrenVnode, index)=>{ // 循环的每一项
    let newChildrenVnode = newChildren[index]

   // 第一层没有变化
    if(childrenVnode.tag === newChildrenVnode.tag){
       // 递归查询子元素 深层次对比 > 递归
      updateChildren(childrenVnode,newChildrenVnode)
    }else{
      
    // 两者tag不一样
      replaceNode(childrenVnode, newChildrenVnode)
     } 
  }) 
}  

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

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

相关文章

编写Groovy Hello World 程序

使用 IntelliJ IDEA 打开 IntelliJ IDEA&#xff0c;并创建一个新的 Groovy 项目。 在项目中创建一个新的 Groovy 类文件&#xff0c;命名为 HelloWorld.groovy。 在 HelloWorld.groovy 文件中&#xff0c;编写以下代码&#xff1a; class HelloWorld {static void main(Stri…

初识Java 16-3 字符串

目录 扫描输入&#xff08;Scanner&#xff09; Scanner的分隔符 使用正则表达式扫描 StringTokenizer 本笔记参考自&#xff1a; 《On Java 中文版》 扫描输入&#xff08;Scanner&#xff09; 先看看在Scanner类加入之前&#xff0c;Java是如何处理文件或标准输入的&…

国际物流常见风险如何规避_箱讯科技

外贸物流是国际贸易的重要环节&#xff0c;其管理和效率的高低直接影响着贸易的成本和效益。因此&#xff0c;外贸企业应该重视物流的组织和管理&#xff0c;提高物流运作的效率。 国际物流基础知识 01什么是“双清包税”和“双清不包税” 双清包税上门又叫双清包税到门&…

接口测试学习手册

很多人会谈论接口测试。到底什么是接口测试&#xff1f;如何进行接口测试&#xff1f;这篇文章会帮到你。 前端和后端 在谈论接口测试之前&#xff0c;让我们先明确前端和后端这两个概念。 前端是我们在网页或移动应用程序中看到的页面&#xff0c;它由 HTML 和 CSS 编写而成…

天软特色因子看板(2023.10 第13期)

该因子看板跟踪天软特色因子A05005(近一月单笔流涌金额占比(%)&#xff0c;该因子为近一个月单笔流通金额占比因&#xff0c;用以刻画股票在收盘时&#xff0c;主力资金在总交易金额中所占的比重。 今日为该因子跟踪第11期&#xff0c;跟踪其在SW801150 (申万医药生物) 中的表现…

STM32-RTC实时时钟

RTC实时时钟 STM32的RTC外设&#xff0c;实质上是一个掉电后还继续运行的定时器。类似于通用定时器TIM外设&#xff0c;可以计时和触发中断。 掉电指的是电源VDD断开时为了RTC外设掉电继续运行&#xff0c;必须接上锂电池给STM32的RTC、备份发卡通过Vbat引脚供电。当主电源VDD有…

TensorBoard官方教程

如何在 PYTORCH 中使用 TENSORBOARD&#xff1a;https://pytorch.org/tutorials/recipes/recipes/tensorboard_with_pytorch.html 更详细一点的&#xff1a;https://pytorch.org/docs/stable/tensorboard.html 主要是 一个函数 writer.add_scalar()

JavaScript基础知识19——循环结构:while循环

哈喽&#xff0c;你好&#xff0c;我是雷工。 本节学习JavaScript基础语法的循环结构&#xff1a;while循环&#xff0c;以下为学习笔记。 while循环 循环概念&#xff1a;重复执行一些操作&#xff1b; 循环特征&#xff1a;不断地重复&#xff1b; while&#xff1a;在…期间…

echarts 力向导图_关系图_知识图谱

Echarts 常用各类图表模板配置 注意&#xff1a; 这里主要就是基于各类图表&#xff0c;更多的使用 Echarts 的各类配置项&#xff1b; 以下代码都可以复制到 Echarts 官网&#xff0c;直接预览&#xff1b; 图标模板目录 Echarts 常用各类图表模板配置一、力向导图二、环形图…

VS Code开发Java之快速入门

VS Code 开发Java的环境 要在VS Code中开发Java应用程序&#xff0c;需要安装以下组件&#xff1a; Java Development Kit&#xff08;JDK&#xff09;&#xff1a;JDK是Java开发的基础&#xff0c;需要下载和安装JDK。Visual Studio Code&#xff1a;VS Code是一个免费的跨平…

Freertos tick 不响应中断的解决方法

代码环境 babyosfreertos 操作方法 通过 shell 操作eeprom 的写操作 问题现象 整个系统会卡在延时函数这里&#xff0c;卡的原因是rtos 的tick中断不响应了。 shell不响应外部命令 系统是正常运行的。 解决方法 成功的方法 ms延时由依赖tick改为us的堵塞延时&#xff1…

虚拟化的基础知识

目录 虚拟化基础 虚拟化的概念 虚拟化的特征&#xff08;本质&#xff09; 虚拟机的两大派别 VMM讲解 虚拟化中的一些重要概念 VMM的功能以及分类 虚拟化的架构 寄居虚拟化 裸金属虚拟化 操作系统虚拟化 混合虚拟化 虚拟化的三个方向 虚拟化基础 虚拟化的概念 什…

VMware打开centos黑屏解决方法汇总

VMware打开centos黑屏解决方法汇总 前言&#xff1a;一. VMware打开centos黑屏解决方法汇总一 .情况情况一&#xff1a;情况二情况三 二. 解决方法最简单的方法&#xff1a;一. 以管理员权限在命令行执行1. 管理员身份运行cmd2. 输入“netsh winsock reset”,回车3. 重启电脑即…

世界电信日 | 人大金仓助力中国移动租赁核算系统升级上线

世界电信日 5月17日恰逢第五十四个世界电信日&#xff0c;运营商作为新型基础设施建设以及维护网信安全的主力军&#xff0c;掌握关键核心技术&#xff0c;实现科技自立自强刻不容缓。 作为数据库领域国家队&#xff0c;人大金仓坚持原始创新&#xff0c;低难度、低成本、低风…

【广州华锐视点】节省成本,提升效果!教你快速搭建一个元宇宙3D虚拟展厅!

在当今这个数字化的时代&#xff0c;拥有一个专业的网站或者小程序已经成为了企业展示形象、推广产品的重要手段。然而&#xff0c;对于许多小企业来说&#xff0c;高昂的开发费用和复杂的技术门槛往往成为了他们实现这一目标的最大阻碍。那么&#xff0c;有没有一种方式&#…

两个字符串的最小ASCII删除和

题目描述 给定两个字符串s1 和 s2&#xff0c;返回 使两个字符串相等所需删除字符的 ASCII 值的最小和 。 示例 思路 这个题的解法一和最长公共子序列的解法大致相同&#xff0c;我们可以在此代码基础上稍微更改即可。 代码如下 解法一 public int minimumDeleteSum1(Stri…

【Spring】DI依赖注入,Lombok以及SpEL

文章目录 1.什么是DI依赖注入2. set方法注入3. ref属性4. 有参构造方法注入5. Lombok6. SpEL 1.什么是DI依赖注入 依赖注入&#xff08;Dependency Injection&#xff0c;简称DI&#xff09;是一种设计模式&#xff0c;也是Spring框架的核心概念之一。其基本思想是将程序中的各…

基于和声算法的无人机航迹规划-附代码

基于和声算法的无人机航迹规划 文章目录 基于和声算法的无人机航迹规划1.和声搜索算法2.无人机飞行环境建模3.无人机航迹规划建模4.实验结果4.1地图创建4.2 航迹规划 5.参考文献6.Matlab代码 摘要&#xff1a;本文主要介绍利用和声算法来优化无人机航迹规划。 1.和声搜索算法 …

openGauss学习笔记-111 openGauss 数据库管理-管理用户及权限-用户权限设置

文章目录 openGauss学习笔记-111 openGauss 数据库管理-管理用户及权限-用户权限设置111.1 给用户直接授予某对象的权限111.2 给用户指定角色111.3 回收用户权限 openGauss学习笔记-111 openGauss 数据库管理-管理用户及权限-用户权限设置 111.1 给用户直接授予某对象的权限 …

git更改鼠标颜色

git bash命令行&#xff0c;默认黑底白字、鼠标移近无法看清鼠标移动范围。 1、控制面板-打开鼠标属性-指针。 选择 windows 黑色&#xff08;系统方案) 保存