前端框架通识:Virtual DOM(虚拟 DOM)

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

众所周知,操作 DOM 是很耗费性能的一件事情,既然如此,我们可以考虑通过 JS 对象来模拟 DOM 对象。

什么是虚拟DOM

vdom是虚拟DOM(Virtual DOM)的简称,指的是用JS模拟的DOM结构,将DOM变化的对比放在JS层来做。换而言之,vdom就是JS对象

如下DOM结构:

<ul class='list'>
  <li>1</li>
</ul>

映射成虚拟DOM就是这样:

const ul = {
  tag: 'ul',
  props: {
    class: 'list'
  },
  children: {
    tag: 'li',
    children: '1'
  }
}

使用原生DOM操作

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
</head>

<body>
  <div id="container"></div>
  <button id="btn-change">改变</button>
  <button id="btn-change-one">改变单个</button>
  <script src="https://cdn.bootcss.com/jquery/3.2.0/jquery.js"></script>
  <script>
    const data = [{
        name: "张三",
        age: 20,
        address: "北京"
      },
      {
        name: "李四",
        age: 21,
        address: "武汉"
      },
      {
        name: "王五",
        age: 22,
        address: "杭州"
      },
    ];
    //渲染函数
    function render(data) {
      const $container = $('#container');
      $container.html('');
      const $table = $('<table>');
      // 重绘一次
      $table.append($('<tr><td>name</td><td>age</td><td>address</td></tr>'));
      data.forEach(item => {
        // 每次进入都重绘
        $table.append($(`<tr><td>${item.name}</td><td>${item.age}</td><td>${item.address}</td></tr>`))
      })
      $container.append($table);
    }
    
    render(data)

    $('#btn-change').click(function () {
        for(let i=0; i < data.length; i++) {
            data[i].age = data[i].age + i
        }
      render(data);
    });
    $('#btn-change-one').click(function () {
        data[1].age = 2000
        render(data);
    })
  </script>
</body>
</html>

看动图:

每次改变数据的时候,浏览器都会重绘渲染DOM,无论之前的DOM数据是否一样。

那有什么解决方法?

这时候就有了虚拟DOM了,就是采用javascript对象模拟,将DOM的比对操作放在javascript层,减少浏览器不必要的重绘,提高效率。

当然有人说虚拟DOM并不比真实的DOM快,其实也是有道理的。

当上述table中的每一条数据都改变时,显然真实的DOM操作更快,因为虚拟DOM还存在javascript中diff算法的比对过程。

所以,上述性能优势仅仅适用于大量数据的渲染并且改变的数据只是一小部分的情况。

虚拟DOM更加优秀的地方在于:

  1. 它打开了函数式的UI编程的大门,即UI = f(data)这种构建UI的方式。
  2. 可以将JS对象渲染到浏览器DOM以外的环境中,也就是支持了跨平台开发,比如ReactNative。

尤大在知乎上的回答

虚拟DOM

我们上面也简单介绍了虚拟DOM,其实通过javascript来模拟 DOM 并且渲染对应的 DOM 只是第一步,难点在于如何判断新旧两个 javascript对象的最小差异并且实现局部更新 DOM。

使用snabbdom实现虚拟DOM

snabbdom的github地址

这是一个简易的实现虚拟DOM功能的库,相比vue、react,对于虚拟DOM这块更加简易,适合我们学习虚拟DOM。

虚拟DOM里面有两个核心的api,一个是h函数(用来生成虚拟DOM对象),一个是patch函数(做虚拟DOM的比对 和 将虚拟DOM挂载到真实DOM上)。

简单介绍一下这两个函数的用法:

  • h('标签名', {属性}, [子元素])
  • h('标签名', {属性}, [文本])
  • patch(container, vnode) container为容器DOM元素
  • patch(vnode, newVnode)

现在我们就来用snabbdom重写一下刚才的例子:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
</head>
<body>
  <div id="container"></div>
  <button id="btn-change">改变</button>
  <button id="btn-change-one">改变单个</button>
  <script src="https://cdn.bootcss.com/snabbdom/0.7.3/snabbdom.js"></script>
  <script src="https://cdn.bootcss.com/snabbdom/0.7.3/snabbdom-class.js"></script>
  <script src="https://cdn.bootcss.com/snabbdom/0.7.3/snabbdom-props.js"></script>
  <script src="https://cdn.bootcss.com/snabbdom/0.7.3/snabbdom-style.js"></script>
  <script src="https://cdn.bootcss.com/snabbdom/0.7.3/snabbdom-eventlisteners.min.js"></script>
  <script src="https://cdn.bootcss.com/snabbdom/0.7.3/h.js"></script>
  <script>
    let snabbdom = window.snabbdom;

    // 定义patch
    let patch = snabbdom.init([
      snabbdom_class, // 从script引入
      snabbdom_props, // 从script引入
      snabbdom_style, // 从script引入
      snabbdom_eventlisteners // 从script引入
    ]);

    //定义h
    let h = snabbdom.h;

    const data = [{
        name: "张三",
        age: 20,
        address: "北京"
      },
      {
        name: "李四",
        age: 21,
        address: "武汉"
      },
      {
        name: "王五",
        age: 22,
        address: "杭州"
      },
    ];
    data.unshift({name: "姓名", age: "年龄", address: "地址"});

    let container = document.getElementById('container');
    let vnode;
    const render = (data) => {
      let newVnode = h('table', {}, data.map(item => { 
        let tds = [];
        for(let i in item) {
          if(item.hasOwnProperty(i)) {
            tds.push(h('td', {}, item[i] + ''));
          }
        }
        return h('tr', {}, tds);
      }));

      if(vnode) {
          patch(vnode, newVnode);
      } else {
          patch(container, newVnode);
      }
      vnode = newVnode;
    }

    render(data);

    let btnChnage = document.getElementById('btn-change');
    btnChnage.addEventListener('click', function() {
        for(let i=1; i < data.length; i++) {
            data[i].age = data[i].age + i
        }
        render(data);
    })
    let btnChnageOne = document.getElementById('btn-change-one');
    btnChnageOne.addEventListener('click', function() {
        data[1].age = 2000
        render(data);
    })
  </script>
</body>
</html>

看动图:

 只有改变的栏目才闪烁,也就是浏览器进行重绘,数据没有改变的栏目还是保持原样,这样就大大节省了浏览器重新渲染的开销。

好了,我们来讲讲  上文画出的重点

难点在于如何判断新旧两个 javascript对象的最小差异并且实现局部更新 DOM

 diff算法

所谓diff算法,就是用来找出两段文本之间的差异的一种算法。

作为一个前端,大家经常会听到diff算法这个词,其实diff并不是前端原创的算法,其实这一个算法早已在linux的diff命令中有所体现,并且大家常用的git diff也是运用的diff算法。

看到这里,在对接上文说的 

难点在于如何判断新旧两个 javascript对象的最小差异并且实现局部更新 DOM 

你就应该知道为什么要用diff算法了吧,找出需要更新的节点,找出的过程就是应用了diff算法。

DOM 是一个多叉树的结构,如果需要完整的对比两颗树的差异,那么需要的时间复杂度会是 O(n ^ 3),这个复杂度肯定是不能接受的。

于是 React 团队优化了算法,实现了 O(n) 的复杂度来对比差异。

实现 O(n) 复杂度的关键就是只对比同层的节点,而不是跨层对比,这也是考虑到在实际业务中很少会去跨层的移动 DOM 元素。 所以判断差异的算法就分为了两步

  1. 首先从上至下,从左往右遍历对象,也就是树的深度遍历,这一步中会给每个节点添加索引,便于最后渲染差异
  2. 一旦节点有子元素,就去判断子元素是否有不同

虚拟DOM算法实现

树的递归

首先我们来实现树的递归算法,在实现该算法前,先来考虑下两个节点对比会有几种情况

  1. 新的节点的 tagName 或者 key 和旧的不同,这种情况代表需要替换旧的节点,并且也不再需要遍历新旧节点的子元素了,因为整个旧节点都被删掉了
  2. 新的节点的 tagName 和 key(可能都没有)和旧的相同,开始遍历子树
  3. 没有新的节点,那么什么都不用做
import { StateEnums, isString, move } from './util'
import Element from './element'

export default function diff(oldDomTree, newDomTree) {
  // 用于记录差异
  let pathchs = {}
  // 一开始的索引为 0
  dfs(oldDomTree, newDomTree, 0, pathchs)
  return pathchs
}

function dfs(oldNode, newNode, index, patches) {
  // 用于保存子树的更改
  let curPatches = []
  // 需要判断三种情况
  // 1.没有新的节点,那么什么都不用做
  // 2.新的节点的 tagName 和 `key` 和旧的不同,就替换
  // 3.新的节点的 tagName 和 key(可能都没有) 和旧的相同,开始遍历子树
  if (!newNode) {
  } else if (newNode.tag === oldNode.tag && newNode.key === oldNode.key) {
    // 判断属性是否变更
    let props = diffProps(oldNode.props, newNode.props)
    if (props.length) curPatches.push({ type: StateEnums.ChangeProps, props })
    // 遍历子树
    diffChildren(oldNode.children, newNode.children, index, patches)
  } else {
    // 节点不同,需要替换
    curPatches.push({ type: StateEnums.Replace, node: newNode })
  }

  if (curPatches.length) {
    if (patches[index]) {
      patches[index] = patches[index].concat(curPatches)
    } else {
      patches[index] = curPatches
    }
  }
}

 判断属性的更改

判断属性的更改也分三个步骤

  1. 遍历旧的属性列表,查看每个属性是否还存在于新的属性列表中
  2. 遍历新的属性列表,判断两个列表中都存在的属性的值是否有变化
  3. 在第二步中同时查看是否有属性不存在与旧的属性列列表中
function diffProps(oldProps, newProps) {
  // 判断 Props 分以下三步骤
  // 先遍历 oldProps 查看是否存在删除的属性
  // 然后遍历 newProps 查看是否有属性值被修改
  // 最后查看是否有属性新增
  let change = []
  for (const key in oldProps) {
    if (oldProps.hasOwnProperty(key) && !newProps[key]) {
      change.push({
        prop: key
      })
    }
  }
  for (const key in newProps) {
    if (newProps.hasOwnProperty(key)) {
      const prop = newProps[key]
      if (oldProps[key] && oldProps[key] !== newProps[key]) {
        change.push({
          prop: key,
          value: newProps[key]
        })
      } else if (!oldProps[key]) {
        change.push({
          prop: key,
          value: newProps[key]
        })
      }
    }
  }
  return change
}

总结

虚拟DOM算法分三步:

  1. 通过 JS 来模拟创建 DOM 对象
  2. 判断两个对象的差异
  3. 渲染差异
let test4 = new Element('div', { class: 'my-div' }, ['test4'])
let test5 = new Element('ul', { class: 'my-div' }, ['test5'])

let test1 = new Element('div', { class: 'my-div' }, [test4])

let test2 = new Element('div', { id: '11' }, [test5, test4])

let root = test1.render()

let pathchs = diff(test1, test2)
console.log(pathchs)

setTimeout(() => {
  console.log('开始更新')
  patch(root, pathchs)
  console.log('结束更新')
}, 1000)

只能用于了解diff算法。

参考:

https://juejin.im/book/5bdc715fe51d454e755f75ef/section/5bdc72e6e51d45054f664dbf

https://juejin.im/post/5d5d32e251882545e41e655d

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万+

一窥Memory测试算法及自我修复机制

摘要 为了满足新一代设备的需求,Memory的大小每三年就会增加4倍。深亚微米设备包含大量面积更小、访问速度更快的Memory。针对此类设计制定自动测试策略可以减少ATE(自动测试设备)的时间和成本。 内存故障的行为与经典的“Stuck-At”故障不同。因此,Memory的故障模型(由于其阵列结构)与标准逻辑的设计也是不同的。Memory测试除了进行故障检测和定位,还可以实现用冗余单元对...

路科验证 2万+

虚拟dom (virtual dom)(vnode)

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

yiyueqinghui的博客 2万+

【Milvus】实战指南:利用milvus-backup实现高效数据备份与恢复

本文详细介绍了如何利用官方工具milvus-backup为Milvus向量数据库实施高效的数据备份与恢复。文章从备份的必要性出发,逐步讲解了环境准备、配置要点、全量与按需备份操作,以及恢复数据的关键步骤和验证方法,旨在帮助用户构建可靠的数据安全防线,应对误操作或系统故障风险。

weixin_29217235的博客 131

从零到一:3D Slicer与MONAI在医学影像中的AI革命

本文探讨了3D Slicer与MONAI在医学影像分析中的革命性应用,展示了如何通过开源工具实现高效的三维影像处理和AI增强分析。结合临床案例,详细介绍了从数据准备到AI分析的全流程,显著提升诊断效率和精度,推动医学影像技术迈向新纪元。

tcp8optimizer的博客 340

基于HarmonyOS API 24旧书回收应用@Entry @Component 与 struct BookRecycleApp入口组件与状态管理:声明式 UI 的核心引擎

在 HarmonyOS NEXT 正式商用的背景下,ArkTS 作为鸿蒙生态的官方应用开发语言,正在从传统的命令式 UI 开发范式向声明式 UI 范式全面迁移。ArkUI 框架以组件化、声明式、状态驱动为核心特征,要求开发者以"描述 UI 应该是什么样"而非"一步步操作 UI 怎么变"的思维方式构建界面。

2401_86031952的博客 249

从零到一:龙芯杯参赛全攻略(含北理工学长经验PDF、B站培训视频与开源代码合集)

本文详细介绍了龙芯杯全国大学生计算机系统能力大赛的参赛全攻略,包括资源整合、技能树构建、团队协作和避坑指南。提供北理工学长经验PDF、B站培训视频与开源代码合集,帮助参赛者从零基础到站上领奖台。重点解析如何高效获取优质资源、避开新手常见陷阱及构建可落地的学习路径,助力普通学生系统学习CPU设计。

weixin_26802933的博客 541

vue核心之真实DOM页面渲染过程和虚拟DOM(vdom)、Diff算法

真实DOM和其解析流程?  浏览器解析HTML的过程 为什么需要虚拟DOM,它有什么好处? vue的templete模版 虚拟节点是何时生成的 data中的数据一修改就会更新到视图上吗 Vue中key的作用 diff算法的步骤 vue核心之虚拟DOM(vdom)与真实DOM页面渲染过程 vue2与vue3中diff算法的区别

muzidigbig的博客 5207

RealSense D455启动教程

RealSense D455启动教程 修改rs_camera.launch

每天进步一点点 2417

3小时学会AI建站!无需编程,个人简历独立站开发速成指南

3小时学会AI建站!个人简历独立站开发速成指南

pei_laoshi的博客 1259

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

参考文献 Virtual Dom库snabbdom代码解析 vue核心之虚拟DOM(vdom) 详解vue的diff算法 一、背景定义 JS操作真实DOM的代价! 用我们传统的开发模式,原生JS或JQ操作DOM时,浏览器会从构建DOM树开始从头到尾执行一遍流程。在一次操作中,我需要更新10个DOM节点,浏览器收到第一个DOM请求后并不知道还有9次更新操作,因此会马上执行流程,最终执行10次。例如,...

CEO___的博客 1064

华为OD机考双机位C卷 - 信道分配(Java & Python& JS & C/C++ & GO )

华为OD机考双机位C卷 - 信道分配

算法大师! 453

从认识 VNode & VDOM 到实现 mini-vue

从认识 VNode & VDOM 到实现 mini-vue

weixin_43822185的博客 1331

S7-1200 G2移植旧版本S7-1200程序的具体方法示例

S7-1200 G2移植旧版本S7-1200程序的具体方法示例

Robot_PLC_HMI_Automation 1513

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

虚拟DOM的两种创建方式

虚拟DOM的两种创建方式。

S2763427717的博客 452

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

虚拟 DOM 详解

虚拟 dom 本质上就是一个普通的 JS 对象,用于描述视图的界面结构 在vue中,每个组件都有一个render函数,每个render函数都会返回一个虚拟 dom 树,这也就意味着每个组件都对应一棵虚拟 DOM 树

TongJ_的博客 3534

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

虚拟dom

1、虚拟DOM(virtual DOM)简称vdom,是一个普通的js对象,用来描述真实dom结构,因为它不是真实的DOM,所以称为虚拟DOM 2、属性:vdom具有三个属性 (1)tag:标签名 (2)attrs:属性 (3)children:子元素对象3、虚拟DOM的设计思想 (1)提供一种方便的工具,使开发效率得到保证; (2)保证最小化的DOM操作,使得执行效率得到保证1、原因一:真实的DOM运行是很慢的,其元素非常庞大,页面的性能问题,大部分都是由DOM操作引起的,真实的DOM节点,哪怕一个最简单

weixin_52972239的博客 2887

深入理解虚拟 DOM(VDOM):原理、优势与应用

要理解虚拟 DOM,首先得从 “真实 DOM” 的痛点说起。真实 DOM(Document Object Model)是浏览器提供的 API,它将 HTML 文档解析成一棵树形结构,每个节点都是一个 DOM 元素对象。我们可以通过 JavaScript 操作 DOM 来更新页面内容,比如修改元素的文本、样式,或者添加 / 删除节点。但真实 DOM 的操作成本非常高:一方面,DOM 节点本身包含大量属性(如parentNodechildNodesstyle等),创建和修改 DOM 会占用较多内存;

前端圈边缘选手,擅长把 UI 稿 “翻译” 成代码,也擅长在 console.log 里写 “求救信号”。日常状态:要么在调像素级对齐,要么在查 “为什么这个样式只在我电脑上生效”。博客不搞高深理论,只唠实在干货~ 1545

【安全篇 / FortiGuard】(7.4) ❀ 02. 独立VDOM下的FortiGuard服务升级 ❀ FortiGate 防火墙

由于业务的需要,创建两个独立VDOM,每个VDOM有各自的宽带,但是FortiGuard服务却无法升级,有什么办法解决吗?

防火墙技术专栏 2084

理解虚拟dom

虚拟 DOM是由一系列的 JavaScript 对象组成的树状结构,每个对象代表着一个DOM元素,包括元素的标签名、属性、子节点等信息。虚拟 DOM中的每个节点都是一个 JavaScript 对象,它们可以轻松地被创建、更新和销毁,而不涉及到实际的DOM操作。将目标所需的 UI 通过数据结构“虚拟”地表示出来,保存在内存中,然后将真实的DOM与之保持同步。

wyzqhhhh的博客 1531

什么是JavaScript虚拟DOM?虚拟DOM的好处有哪些?

JavaScript虚拟DOM的实现是现代Web开发中非常重要的一个概念。这个概念是在2013年由React框架提出的,它被广泛应用于各种Web开发框架中。虚拟DOM是一种将应用程序的状态与DOM元素分离的方法。在本文中,我们将探讨JavaScript虚拟DOM的实现,并介绍它的一些优势和局限性。什么是虚拟DOM?DOM(文档对象模型)是浏览器中用于表示HTML,XML和SVG文档的树形结构。在Web开发中,DOM是操作网页内容和样式的主要方式。DOM的缺点在于它的操作是非常昂贵的。

tyxjolin的专栏 672

教程篇(7.2) 13. 虚拟域 VDOM & FortiGate基础设施 ❀ Fortinet网络安全专家 NSE4

在本节课中,你将学习如何配置VDOM,并查看常用示例。

防火墙技术专栏 2498

【JavaScript】虚拟 DOM

虚拟 DOM 需要进⾏额外的计算和⽐较操作,⽽这些操作也会消耗⼀定的时间和性能。因此,虚拟 DOM 适⽤于⼤规模、⾼度动态的⻚⾯,⽽在简单的静态⻚⾯中使⽤虚拟 DOM 并不能提⾼性能。虚拟 DOM 是⼀层对真实DOM的抽象,以JavaScript 对象 (VNode 节点) 作为基础的树,⽤对象的属性来描述节点,最终可以通过⼀系列操作使这棵树映射到真实环境上。虚拟DOM算法操作真实DOM,性能⾼于直接操作DOM,直接操作DOM还会引用回流或者重绘,虚拟DOM和虚拟DOM算法是两种概念。

小秀的博客 356

Vue.js 中的虚拟 DOM 是什么?如何使用虚拟 DOM?

虚拟DOM是一种用于优化页面渲染性能的技术,通过使用虚拟DOM,可以避免对整个页面进行重新渲染,提高页面的渲染性能。在Vue.js中,每个组件都有自己的虚拟DOM树,当组件的状态发生变化时,Vue.js会使用虚拟DOM算法比较新旧两个虚拟DOM树的差异,并将更新后的虚拟DOM树渲染到浏览器中。在使用虚拟DOM的过程中,开发者应该遵循一些最佳实践,比如利用组件化思想开发、避免频繁操作DOM、尽量减少VNode的数量、使用key属性优化列表渲染等等。通过合理使用虚拟DOM,可以提高页面的渲染性能,提升用户体验。

Java徐师兄的博客 2096

vdom的原理

结论 vue中vdom渲染页面的过程:将<template>模板,通过render渲染函数(createElement())得到虚拟的DOM树,通过diff算法进行新旧虚拟节点的比较,再通过patch更新到真实的dom上实现视图的更新。 1.什么是Virtal DOM? vdom指的是用JS模拟的DOM结构,将DOM的变化对比放在JS层。 <ul id="list"> ...

黑黑黑眼圈博客 1216
上一篇: 前端框架通识:路由原理
下一篇: js转进制大全
An_s
博客等级 码龄10年 665粉丝 363原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

An_s

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值