vue面试题-原理层

news/2025/2/15 17:55:37/
  • 虚拟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 // 目标元素 ullet attrs = vnode.attrs || {}  // 属性let children = vnode.children || [] // 子节点if(!tag) {return null}// 1.创建对应的domlet elem = document .createElement(tag)// 2.给dom添加属性let attrNamefor(attrName in attrs){if(attrs.hasOwnProperty(attrName)){// classelem.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.ppmy.cn/news/1189586.html

相关文章

【三方登录-Apple】iOS 苹果授权登录(sign in with Apple)之开发者配置一

记录一下sign in with Apple的开发者配置 前言 关于使用 Apple 登录 使用“通过 Apple 登录”可让用户设置帐户并使用其Apple ID登录您的应用程序和关联网站。首先使用“使用 Apple 登录”功能启用应用程序的App ID 。 如果您是首次启用应用程序 ID 或为新应用程序启用应用程序…

众和策略:微软大动作

当地时间周二&#xff0c;美股首要指数全线收涨。但从月度数据来看&#xff0c;美股首要指数录得“三连跌”&#xff0c;10月份&#xff0c;道指跌1.36%&#xff0c;标普500指数跌2.2%&#xff0c;纳指跌2.78%。其间&#xff0c;标普和道指均为2020年3月以来初次呈现三个月连跌…

虚拟机风格>解释器风格

1.解释器风格 解释器作为一种体系结构&#xff0c;主要用于构建虚拟机&#xff0c;以弥合程序语义和计算机硬件之间的间隙。在解释器结构中&#xff0c;主要包括一个执行引擎和三个存储器。它的实质是利用软件创建的一种虚拟机&#xff0c;因此&#xff0c;解释器风格又被称为…

`.NET Web`新人入门必学项目`EarthChat`

.NET Web新人入门必学项目EarthChat EarthChat是一个基于.NET 7的实战项目&#xff0c;EarthChat提供了很多的最佳实践&#xff0c;EarthChat的目标也是成为一个很多人都喜欢的大型聊天业务系统&#xff0c;并且将结合SKAI大模型进行打造智能业务系统&#xff0c;在EarthChat中…

Intel oneAPI笔记--oneAPI简介、SYCL编程简介

oneAPI简介 Intel oneAPI是Intel提供的统一编程模型和软件开发框架。 它旨在简化可充分利用英特尔各种硬件架构&#xff08;包括 CPU、GPU 和 FPGA&#xff09;的应用程序的开发 oneAPI一个重要的特性是开放性&#xff0c;支持多种类型的架构和不同的硬件供应商&#xff0c;是…

CentOS一键部署Docker

Docker官网&#xff1a;https://www.docker.com/ CentOS&#xff08;7.6&#xff09; Docker&#xff08;18.06.1&#xff09;一键安装脚本 #!/bin/bash echo "1、安装依赖..." yum -y install gcc yum -y install gcc-c##验证gcc版本 gcc -vecho "2、卸载老…

Leetcode循环队列

这道题十分考验我们对队列的理解。 文章目录 队列的介绍队列的实现进入正题 队列的介绍 队列是一种只允许在一段进行插入&#xff0c;在另一端进行删除的数据操作的特殊线性结构&#xff0c;&#xff0c;因此决定了他具有先入先出的特点&#xff0c;其中进行插入操作的一段叫做…

【T3】畅捷通T3软件关闭服宝窗口

【问题描述】 畅捷通T3登录后&#xff0c; 右下角会出现服宝窗口&#xff0c;需要手工退出。 但是每次重新登录账套后都会出现&#xff0c;非常烦&#xff1b;并且界面空白。 【解决方法】 在软件的安装目录下\UFSMART\Portal&#xff0c;找到【url.ini】文件。 用记事本打开…