VDOM(虚拟dom、diff算法)和key

什么是虚拟DOM (virtual dom)(vnode) 虚拟dom最先是由facebook团队提出的,最先运用在react中,之后在vue2.0版本中引入了虚拟DOM的概念虚拟 dom 是相对于浏览器所渲染出来的真实 dom 的,以往,我们改变更新页面,只能通过首先查找dom对象,再进行修改dom的方式来达到目的。, 因为每次查询 dom ,都需要遍历整颗 dom 树。现在,我们用对象的方式来描述真实的 dom,并且通过对象与真实dom建立了一一对应的关系,那么每次 dom 的更改,我通过找到相应对象,也就找到了相应的dom节点,再对其进行更新。 阅读详情

参考文献

vue核心之虚拟DOM(vdom)

一、背景定义

JS操作真实DOM的代价!

用我们传统的开发模式,原生JS或JQ操作DOM时,浏览器会从构建DOM树开始从头到尾执行一遍流程。在一次操作中,我需要更新10个DOM节点,浏览器收到第一个DOM请求后并不知道还有9次更新操作,因此会马上执行流程,最终执行10次。例如,第一次计算完,紧接着下一个DOM更新请求,这个节点的坐标值就变了,前一次计算为无用功。计算DOM节点坐标值等都是白白浪费的性能。即使计算机硬件一直在迭代更新,操作DOM的代价仍旧是昂贵的,频繁操作还是会出现页面卡顿,影响用户体验。

二、原理解析

《Virtual Dom库snabbdom代码解析》

Virtual Dom 的原理是用JavaScript对象表示 DOM 信息结构,当状态改变的时候,重新构建一颗对象树,然后通过新渲染的对象树(newVnode)去和旧的对象树(oldVnode)进行对比,他使用了一个diff 差异算法计算差异,记录下来的不同就应用在真正的dom树上,从而减少页面的回流和重绘。

DOM 属于渲染引擎,而 JS 又是属于 JS 引擎,JS 要操作 DOM ,就要涉及 JS 引擎线程和 GUI渲染线程的通信,而线程间通信代价是非常昂贵的,这也是造成 JS 操作 DOM 效率不高的原因。减少这种性能消耗做法:减少回流重绘次数 《从各大跨平台技术说起,我们真的需要虚拟 DOM 吗》

优点:

《从各大跨平台技术说开去,我们真的需要虚拟 DOM 吗?》、《神三元》

  • 批量操作更新视图:虚拟 DOM 进行频繁修改,不会立马进行回流重绘,而是一次性比较并修改真实 DOM 中需要改的部分,最后在真实 DOM 中进行排版与重绘,减少过多回流重绘的损耗
  • 虚拟 DOM 有效降低大面积真实 DOM 的回流重绘,因为最终与真实 DOM 比较差异,可以只渲染局部
  • 它打开了函数式的UI编程的大门,即UI = f(data)这种构建UI的方式
  • 夸端:(这个优点其实是主要的)虚拟 DOM 本质上是 JavaScript 对象,而 DOM 与平台强相关,相比之下虚拟 DOM 可以进行更方便地跨平台操作,可以通过不同的渲染引擎生成不同平台下的 UI。例如RN(react-native)、weex( weeks 的谐音)、flute 移动开发等等
不足之处:
  • 有人说虚拟DOM并不比真实的DOM快,其实也是有道理的。当视图中每一条数据都改变时,显然真实的DOM操作更快,因为虚拟DOM还存在js中diff算法的比对过程。所以,VDOM性能优势针对于于大量数据的渲染并且改变的数据只是一小部分的情况
Vue选择的virtual dom库是snabbdom

几个重要的api:

  • h(tag,attr,children):生成vdom
  • patch(container, vnode):将h()函数生成的虚拟dom替换掉原生真实的dom
  • patch(vnode,newVnode):diff算法进行前后对比虚拟dom

注:tag:标签;attr:节点的属性比如id,class等等;children:节点的子节点

vnode对象属性:

  • tag 属性即这个vnode的标签名
  • data 属性包含了最后渲染成真实dom节点后,节点上的class,attribute,style以及绑定的事件
  • children 属性是vnode的子节点
  • text 属性是文本属性
  • elm 属性为这个vnode对应的真实dom节点
  • key 属性是vnode的标记,在diff过程中可以提高diff的效率(主要是针对列表渲染)
定义了一个vnode,它的数据结构是:
 {
        tag: 'div'
        data: {
            id: 'app',
            class: 'page-box'
        },
        children: [
            {
                tag: 'p',
                text: 'this is demo'
            }
        ]
    }
渲染出的实际的dom结构就是:
 <div id="app" class="page-box">
       <p>this is demo</p>
   </div>
diff算法实现(使用patch函数)
var snabbdom = require('snabbdom');
var patch = snabbdom.init([ // Init patch function with chosen modules
  require('snabbdom/modules/class').default, // makes it easy to toggle classes
  require('snabbdom/modules/props').default, // for setting properties on DOM elements
  require('snabbdom/modules/style').default, // handles styling on elements with support for animations
  require('snabbdom/modules/eventlisteners').default, // attaches event listeners
]);
var h = require('snabbdom/h').default; // helper function for creating vnodes

var container = document.getElementById('container');

var vnode = h('div#container.two.classes', {on: {click: someFn}}, [
  h('span', {style: {fontWeight: 'bold'}}, 'This is bold'),
  ' and this is just normal text',
  h('a', {props: {href: '/foo'}}, 'I\'ll take you places!')
]);
// Patch into empty DOM element – this modifies the DOM as a side effect
patch(container, vnode);

var newVnode = h('div#container.two.classes', {on: {click: anotherEventHandler}}, [
  h('span', {style: {fontWeight: 'normal', fontStyle: 'italic'}}, 'This is now italic type'),
  ' and this is still just normal text',
  h('a', {props: {href: '/bar'}}, 'I\'ll take you places!')
]);
// Second `patch` invocation
patch(vnode, newVnode); // Snabbdom efficiently updates the old view to the new state

可以看到patch函数是snabbdom.init出来的,而且传入的参数既可以是用h函数返回的一个vnode又可以是实际的dom元素,现在我们看看init方法的代码,一些实现钩子之类的代码我们就不看了

  // snabbdom的init方法
  ...
export function init(modules: Array<Partial<Module>>, domApi?: DOMAPI) {
  ...
  return function patch(oldVnode: VNode | Element, vnode: VNode): VNode {
    let i: number, elm: Node, parent: Node;
    const insertedVnodeQueue: VNodeQueue = [];
    for (i = 0; i < cbs.pre.length; ++i) cbs.pre[i]();

    if (!isVnode(oldVnode)) {
      oldVnode = emptyNodeAt(oldVnode);
    }

    if (sameVnode(oldVnode, vnode)) {
      patchVnode(oldVnode, vnode, insertedVnodeQueue);
    } else {
      elm = oldVnode.elm as Node;
      parent = api.parentNode(elm);

      createElm(vnode, insertedVnodeQueue);

      if (parent !== null) {
        api.insertBefore(parent, vnode.elm as Node, api.nextSibling(elm));
        removeVnodes(parent, [oldVnode], 0, 0);
      }
    }

    for (i = 0; i < insertedVnodeQueue.length; ++i) {
      (((insertedVnodeQueue[i].data as VNodeData).hook as Hooks).insert as any)(insertedVnodeQueue[i]);
    }
    for (i = 0; i < cbs.post.length; ++i) cbs.post[i]();
    return vnode;
  };
}

三、diff算法

《详解vue的diff算法》、《vue 虚拟dom实现原理》

两棵树如果采用深度遍历完全比较时间复杂度是O(n^3),因此为了为了提高速度(复杂度为O(n)),采取diff算法比较新旧节点的时候,比较只会在同层级进行, 不会跨层级比较。

算法首先会对新旧两棵树进行一个深度优先的遍历,这样每个节点都会有一个序号。在深度遍历的时候,每遍历到一个节点,我们就将这个节点和新的树中的节点进行比较,如果有差异,则将这个差异记录到一个对象中

  • 永远只比较同层节点。
  • 不同的两个节点产生两个不同的树。
  • 通过key值指定哪些更新是相同的。

diff算法是为了以最小代价去将oldVnode修改成newVnode,核心方法是

  1. sameVnode通过判断传入的2个vnode的key,tag, 是否同为注释节点 、inputType等是否相同,来判断两节点是否值得比较,值得比较则执行patchVnode。只有当基本属性相同的情况下才认为这个2个vnode只是局部发生了更新,然后才会对这2个vnode进行diff,如果2个vnode的基本属性存在不一致的情况,那么就会直接跳过diff的过程,进而依据vnode新建一个真实的dom,同时删除老的dom节点
  2. patchVnode判断(3种情况)
    1. 都为文本且不相等,则替换文本
    2. 一个有子节点一个没有(直接做对应的添加或者删除节点)
    3. 都有子节点调用updateChildren进行比较子节点(核心讨论部分,也是diff的核心)
  3. updateChildren 4个指针比较:对新老节点的子节点列表进行指针标记;oldStart+oldEnd,newStart+newEnd;即分别用两个指针标记头部和尾部
  4. 对比新老子节点进行匹配,并且做相应的指针移动

对列表元素进行对比的时候,由于 TagName 是重复的,所我们需要给每一个子节点加上一个 key,列表对比的时候使用key 来进行比较,这样我们才能够复用老的 DOM 树上的节点

如果我们提供key值,diff算法会更高效,这样我们才能够复用老的 DOM树上的节点。因为本身diff算法里面有做key的判断了。下面是有key时候的diff流程
在这里插入图片描述

function patch (oldVnode, vnode) {
    // some code
    if (sameVnode(oldVnode, vnode)) {
        patchVnode(oldVnode, vnode)
    } else {
        const oEl = oldVnode.el // 当前oldVnode对应的真实元素节点
        let parentEle = api.parentNode(oEl)  // 父元素
        createEle(vnode)  // 根据Vnode生成新元素
        if (parentEle !== null) {
            api.insertBefore(parentEle, vnode.el, api.nextSibling(oEl)) // 将新元素添加进父元素
            api.removeChild(parentEle, oldVnode.el)  // 移除以前的旧元素节点
            oldVnode = null
        }
    }
    // some code 
    return vnode
}

四、key的使用

知乎的一篇文章
vue 中 key 值的作用可以分为两种情况来考虑。

由于 Vue 会尽可能高效地渲染元素,通常会复用已有元素而不是从头开始渲染。因此当我们使用v-if 来实现元素切换的时候,如果切换前后含有相同类型的元素,那么这个元素就会被复用。如果是相同的 input 元素,那么切换前后用户的输入不会被清除掉,这样是不符合需求的。因此我们可以通过使用 key 来唯一的标识一个元素,以便它能跟踪每个节点的身份,从而重用和重新排序现有元素。这个时候 key 的作用是用来标识一个独立的元素。

  • 第二种情况是 v-for 中使用 key。

用 v-for 更新已渲染过的元素列表时,它默认使用“就地复用”的策略。如果数据项的顺序发生了改变,Vue 不会移动 DOM 元素来匹配数据项的顺序,而是就地更新每个元素,并且确保它们在每个索引位置正确渲染。因此通过为每个列表项提供一个 key 值,来以便 Vue 跟踪元素的身份,从而高效的实现复用。这个时候 key 的作用是为了高效的更新渲染虚拟 DOM。

不使用数组下标作为key

vue不推荐使用数组下标作为key的原因。例如数组删除了一个元素,那么这个元素后方元素的下标全都前移了一位,之前key对应的数据和dom就会乱了,除非重新匹配key,那就容易产生错误。如果重新匹配key,等于全部重新渲染一遍,违背了使用key来优化更新dom的初衷

Vue 中的 key 到底有什么用?

  • key 是给每一个 vnode 的唯一 id,依靠 key,我们的 diff 操作可以更准确、更快速 (对于简单列表页渲染来说 diff 节点也更快,但会产生一些隐藏的副作用,比如可能不会产生过渡效果,或者在某些节点有绑定数据(表单)状态,会出现状态错位。)

  • diff 算法的过程中,先会进行新旧节点的首尾交叉对比,当无法匹配的时候会用新节点的 key 与旧节点进行比对,从而找到相应旧节点.

  • 更准确 : 因为带 key 就不是就地复用了,在 sameNode 函数 a.key === b.key 对比中可以避免就地复用的情况。所以会更加准确,如果不加 key,会导致之前节点的状态被保留下来,会产生一系列的 bug。

  • 更快速 : key 的唯一性可以被 Map 数据结构充分利用,相比于遍历查找的时间复杂度 O(n),Map 的时间复杂度仅仅为 O(1)

vdom(虚拟DOM) vdom就是用JS模拟DOM结构,DOM变化的对比放在JS层来坐,提高重绘性能 首先先来看下DOM节点body的属性,下图可以看出属性非常大,所以DOM的操作是“昂贵”的,js的运行效率高,我们要尽量减少DOM的操作,项目越复杂,DOM操作影响越严重 如何用JS模拟DOM结构,如下 <ul id='test'> <li class='item'>111</li> </ul> //js模拟 { tag:'ul', .. 阅读详情

相关推荐

锐捷防火墙(WEB)——混合模式(VDOM)场景

虚拟域(VDOM),可以理解为虚拟防火墙,是一种将一个RG-WALL设备分为两个或两个以上虚拟设备的技术,它能起到多个独立设备的作用。VDOM可提供单独防火墙策略,在NAT/路由模式下,它可完全分开配置,从而为各连通网络或组织提供路由或VPN服务,同时VDOM之间也可以互访。设备的系统资源可以手动分配给不同的VDOM。一般常用于需要完成独立分割的多个网络,比如云环境;由于NGFW只能切换成nat和透明的其中一种模式,所以在既有透明又有nat路由的混合环境下必须使用VDOM模式来实施”

君逍遥o 1083

【高级篇 / VDOM】(5.6) ❀ 01. 创建 VDOM 虚拟域 ❀ FortiGate 防火墙

【简介】虚拟域(VDOM),可以理解为虚拟防火墙,是一种将一台设备分为两个或两个以上虚拟设备的技术,它能起到多个独立设备的作用。VDOM可提供单独防火墙策略,在NAT/路由模式下,它可完全分开配置,从而为各连通网络或组织提供路由或VPN服务,同时VDOM之间也可以互访。设备的系统资源可以手动分配给不同的VDOM。一般常用于需要完成独立分割的多个网络,比如云环境。 ......

防火墙技术专栏 2万+

ESP32-S3数字麦克风入门:手把手教你用Arduino IDE读取MSM261S4030H0R的I2S数据

本文详细介绍了如何使用Arduino IDE读取MSM261S4030H0R数字麦克风的I2S数据,涵盖硬件连接、代码编写和数据可视化全流程。重点解决I2S引脚配置、环境噪声过滤和声波观察等实际问题,适合ESP32-S3开发者快速上手数字麦克风应用。

weixin_26742753的博客 318

虚拟dom (virtual dom)(vnode)

1,虚拟DOM的逻辑(React虚拟dom到真实dom发生了什么) 2,React16 更新了什么 React16中引入了Fiber这个概念,从根本上解决了由于js的单线程运行,遇到计算量较大的情况,导致动画和交互卡顿的问题。 Fiber的核心是实现了一个基于优先级和requestIdleCallback的循环任务调度算法 。它可以把一个任务拆分成多个小任务,并且可随时中止或恢复任务,同时也可以...

yiyueqinghui的博客 2万+

华为使用MicroG安装并使用Google服务教程

鉴于众多华为手机用户因无法使用Google服务而感到不便,我经过多次摸索和测试,总结了一份简单易懂的教程,希望能够帮助到大家。无论是需要使用Google Play商店下载应用,还是需要使用Google服务进行工作和学习,本文将详细介绍如何在华为手机上安装并使用Google服务。二、前置条件软件要求:Aurora Store(替代Google Play商店)、MicroG Companion、MicroG Server(替代Google框架)

weixin_41926602的博客 3万+

香橙派5Max + Realsense D435i + Fast-Drone-250:手把手教你搭建一个完整的无人机视觉开发环境

本文详细介绍了如何利用香橙派5Max、Realsense D435i深度相机和Fast-Drone-250项目搭建完整的无人机视觉开发环境。从硬件连接到ROS配置,再到项目部署与性能优化,提供全栈式实战指南,助力开发者快速实现SLAM算法验证和自主导航功能开发。

weixin_30879169的博客 463

虚拟dom和diff算法

虚拟dom && diff算法 ( 王者 ) 什么是虚拟dom 它是一个Object对象模型,用来模拟真实dom节点的结构 需求 vdom 如何模拟真实的dom 如果将来我想在增加一个li,里面的内容为:这是xxx 在增加10个li 内容为:miss su <div class = "box"> <ul> &l...

weixin_42307490的博客 167

随机森林模型及案例(Python)

1 集成模型简介 集成学习模型使用一系列弱学习器(也称为基础模型或基模型)进行学习,并将各个弱学习器的结果进行整合,从而获得比单个学习器更好的学习效果。 集成学习模型的常见算法有Bagging算法和Boosting算法两种。 Bagging算法的典型机器学习模型为随机森林模型,而Boosting算法的典型机器学习模型则为AdaBoost、GBDT、XGBoost和LightGBM模型。 1.1 Bagging算法简介 Bagging算法的原理类似投票,每个弱学习器都有一票,最终根据所有弱学习器的投

qq_42433311的博客 4万+

VUE虚拟DOM以及diff算法及key的好处

Vue的虚拟DOM(VDOM)的diff算法与key属性的不同。

GoodLuck_wu5的博客 1041

自动批量安装加载cran, bioconductor和github三个平台的所有的R包

自动批量安装加载cran, bioconductor和github三个平台的所有的R包

qq_40073899的博客 561

优化翼型形状的遗传算法实现

在每一代种群中,通过计算每个个体的适应度值,选择具有较高适应度值的个体,并使用交叉和变异算子对它们进行操作,从而生成新的个体。具体而言,我们将采用一个参数化的翼型模型,其中包括几何设计变量,如角度、弯曲和厚度等,以及性能指标,如升阻比和扭矩等。总之,本文提供了一个基于遗传算法的优化方法,用于寻找最优的翼型形状,并提供MATLAB源代码。需要注意的是,上述代码中的objFunc函数是一个示例性质的目标函数,实际应用中需要根据具体的问题进行修改。1.初始化一个随机的种群,其中每个个体代表一个参数化的翼型模型。

与其临渊羡鱼,不如退而结网 517

虚拟DOM 和 Diff 算法,key的作用,jsx,render函数

虚拟DOM 和 Diff 算法 什么是虚拟DOM? 使用javascript模拟了DOM结构的树形结构(对象表示),这个树结构包含整个DOM结构的信息 使用虚拟DOM有什么好处? 操作数据要大大的减少性能损耗,提高渲染效率 越多的真实dom操作,越损耗性能 什么是Diff 算法? 是linux的基础命令,用来比较两个文本文件的差异,是...

weixin_30364325的博客 82

YOLOv11改进 ,YOLOv11改进主干网络为MobileNetV3,助力涨点

MobileNetV3通过结合硬件感知网络架构搜索(NAS)和NetAdapt算法,通过新颖的架构改进进一步提升了性能。本文开始探讨了自动化搜索算法与网络设计如何协同工作,以利用互补方法来提升整体技术水平。通过这一过程,创建了两个新的MobileNet模型:MobileNetV3-Large和MobileNetV3-Small,分别针对高资源和低资源使用场景。这些模型随后被适配并应用于目标检测和语义分割任务。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 1937

浅谈Vue中的虚拟DOM

浅谈Vue中的虚拟DOM 什么是虚拟DOM? 使用虚拟DOM有什么好处? 虚拟dom 案例: 来说明为什么 virtual dom 是好用的 我有一个数 0 ,我希望这个数自增到 10001 , 然后让这个数据输出到页面中? var box = document.querySelector( '.box' ) ; var count = 0 ; // console....

nerao的博客 1558

从零开始跑通3DGS教程:(四)修改(缩放、空间变换)colmap生成的sfm结果

通过colmap进行的sfm的普通方式会丢失场景的物理尺度信息,并且并不在符合一般认知的坐标系下,本文将读取colmap生成的点云和相机pose,将其进行空间变换和缩放之后,重新保存,新保存的结果仍然可以被colmap读取以及进行后续的稠密重建以及3dgs等工作

诺有缸的高飞鸟的博客 1424

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

谈谈Vue/React中的虚拟DOM(vDOM)与Key值

谈谈Vue/React中的虚拟DOM(vDOM)与Key值 一、DocumentFragment 在了解虚拟DOM前,先来了解DOM的一个对象属性——DocumentFragment。 在一次操作中,需要频繁操作DOM时,就可以先将要改变的节点附在DocumentFragment上,之后再将该对象渲染到DOM中,改方法只对DOM进行了一次操作,可以显著提高性能。 但是该方法只适用于局部操作,而在真...

failte的博客 1085

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Vue原理「十二」-- vdom和diff算法 *****

diff 算法概述 diff即对比,是一个广泛的概念,如linux diff、git diff 两个JS对象也可以做diff 两颗树做diff,如vdom diff 树diff 时间负责度是o(n^3) 第一,遍历tree1;第二,遍历tree2 第三,排序 1000个节点,要计算 1亿次,算法不可用 优化时间复杂度到o(n) 之比较同一级,不跨级比较 tag不相同,则直接删掉重建,不再深度比较 tag和key两者都相同,则认为是相同节点,不再深度比较 patchVnode() diff算法总结 pa

louShuMei 的博客 603

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

vue 数据变化更新视图原理之 vdom(虚拟dom)、vnode(虚拟节点)、 diff算法、为什么不能用index作为key?

vdom(虚拟dom)、vnode(虚拟节点)、 diff算法

m0_64572085的博客 338

react:浅聊 vdom 与 diff 算法

本文深入解析虚拟DOM与Diff算法原理,揭示如何通过O(n)复杂度优化实现高效渲染。重点剖析列表更新中Key的“身份证”作用,并用实例展示误用Index导致状态错位的Bug,助你彻底掌握React性能核心。

2302_80706750的博客 329

虚拟dom && diff算法

虚拟dom && diff算法 1.虚拟dom是什么 ​ 它是一个Object对象模型,用来模拟真实dom节点的结构 2.虚拟dom的使用基本流程(前四步骤) ​ 1.获取数据 ​ 2.创建vdom ​ 3. 通过render函数解析jsx,将其转换成 vdom结构 ​ 4.将vdom渲染成真实dom ​ 5.数据更改了 ​ 6.使用diff算法比对两次vdom,生成patch对象...

weixin_30525825的博客 137

Vue.js 中的 V-DOM 和 diff 算法

Vue.js 中的 VDOM 和 diff 算法1. 为什么要使用 VDOM (虚拟DOM)2. 虚拟dom(vdom)是什么?3. 虚拟dom的使用基本流程4.diff算法是什么?总结: 1. 为什么要使用 VDOM (虚拟DOM) 大量的DOM操作会大量增加时间消耗,性能的消耗。 而数据的操作,时间和性能的消耗就很少 因此我们应该先进行数据操作,在进行DOM操作 因此我们 引入了虚拟DOM 2...

qq_39687278的博客 676

虚拟dom && diff算法

vue2.0加入了virtual dom,有点向react靠拢的意思。vue的diff位于patch.js文件中,复杂度为O(n)。 了解diff过程,我们先从虚拟dom开始。 虚拟dom && diff算法 1.虚拟dom是什么? 所谓的virtual dom,也就是虚拟节点。它通过JS的Object对象模拟DOM中的节点,然后再通过特定的render方法将其渲染成真实的DOM...

weixin_45213847的博客 233
上一篇: Vue的深入理解
下一篇: HTML/CSS知识点小结
鹏鱼雁
博客等级 码龄9年 3388粉丝 21原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值