终于搞懂虚拟Dom啦!

简介: 终于搞懂虚拟Dom啦!

以一种对象结构的方式描述页面。通过比对虚拟dom的数据结构差异,来更新实际dom,避免了传统dom中的重绘问题。

1. 原生DOM所带来的问题


使用原生DOM进行操作时,每次更新界面都需要重新计算整个DOM树的结构和样式,然后进行重新渲染,这样的操作会带来性能上的开销。

举一个例子,假设我们需要向一个列表中添加 1000 个列表项。如果使用原生 DOM 进行操作,每次添加列表项都需直接对实际 DOM 进行插入操作,这样做会导致页面渲染变慢,用户体验下降。

2. 虚拟DOM是什么


虚拟DOM是一个轻量级的JavaScript对象,它是对真实DOM的一种抽象表示。React通过使用虚拟DOM来跟踪和记录对真实DOM的修改,然后批量高效地更新真实DOM。


虚拟dom vs 真实dom


结构对比

原生js中的 doucment.createEelment和 react.reacteElement 创建元素,打印出来看下数据结构

const VDOM = React.createElement('div', {}, '小杜杜')
    const DOM = document.createElement("div");
    DOM.innerHTML = '真帅呀'
    console.log(`虚拟DOM:`, VDOM)
    console.log(`真实DOM:`, DOM)

流程对比

在传统的Web应用中,数据的变化会实时地更新到用户界面中,于是每次数据微小的变化都会引起DOM的渲染。

而虚拟DOM的目:是将所有的操作聚集到一块,计算出所有的变化后,统一更新一次虚拟DOM

举一个例子,假设我们需要向一个列表中添加 1000 个列表项。如果使用原生 DOM 进行操作,渲染1000次,而使用虚拟dom只需要要渲染一次。

react中组件名为什么大写?

用于区分react组件和原生标签,在react中渲染组件是使用bebal来解析jsx内容,大写命名组件,是告诉jsx将组件渲染真实dom

3. 虚拟DOM大致工作流程


  • React首次渲染时,会构建整个组件树的虚拟DOM。
  • 当状态发生变化时,React会生成新的虚拟DOM树。
  • React会将新旧虚拟DOM树进行对比,找出需要更新的部分。
  • 根据对比结果,React会生成一系列DOM操作指令。
  • React将这些指令应用到真实DOM上,实现页面的局部更新。


4. 虚拟DOM是如何解决问题的


虚拟DOM通过在JavaScript中使用轻量级的虚拟对象来代替真实DOM,实现了对真实DOM的抽象。通过比较新旧虚拟DOM树的差异,React能够准确计算出需要更新的部分,并只对这些部分进行DOM操作,避免了不必要的DOM操作开销,提高了性能。


5. 虚拟DOM真的能带来更好的性能吗?


是的,虚拟DOM能够带来更好的性能。通过对比新旧虚拟DOM树,React可以最小化DOM的操作次数,只对需要更新的部分进行操作,从而减少了浏览器重绘的次数,提升了性能效率。


6. 虚拟DOM的价值到底是什么


虚拟DOM的价值主要体现在两个方面:


  • 提高性能: 通过最小化DOM操作的次数,优化了页面的渲染性能,提升了用户体验。
  • 更方便的开发: 使用虚拟DOM可以将关注点从底层的DOM操作转移到组件开发上,使得开发者更关注组件的构建和交互逻辑,从而提高开发效率。


7. 虚拟DOM用在哪里


虚拟DOM主要被应用于React框架中,用于构建用户界面。React使用虚拟DOM作为中间层,负责管理组件的状态变化,并高效地更新页面的显示。


8. 简单实现虚拟DOM案例


这是一个简单的虚拟DOM案例,用于展示虚拟DOM的基本原理,仅供参考:

// 定义虚拟DOM元素的构造函数
function VNode(tagName, props, children) {
  this.tagName = tagName;
  this.props = props;
  this.children = children;
}
// 渲染虚拟DOM
function render(element) {
  if (typeof element === 'string') {
    // 如果是字符串类型,直接返回文本节点
    return document.createTextNode(element);
  }
  // 创建对应的真实DOM
  const dom = document.createElement(element.tagName);
  // 设置props中的属性
  for (let propName in element.props) {
    dom.setAttribute(propName, element.props[propName]);
  }
  // 递归渲染子节点
  element.children.forEach(child => {
    dom.appendChild(render(child));
  });
  return dom;
}
// 创建虚拟DOM
const element = new VNode('div', { id: 'app' }, [
  new VNode('h1', null, ['Hello, World!']),
  new VNode('p', null, ['This is a virtual DOM example.'])
]);
// 渲染虚拟DOM到真实DOM节点
const app = document.getElementById('app');
app.appendChild(render(element));

这是一个简单的虚拟DOM案例,通过构造虚拟DOM元素,并使用render函数将虚拟DOM渲染为真实DOM,从而实现了页面的展示。当需要更新页面时,只需要更新虚拟DOM,然后重新调用render函数即可。

相关文章
|
6月前
|
JavaScript 前端开发 编译器
说说你对虚拟 DOM 的理解?
说说你对虚拟 DOM 的理解?
55 0
|
6月前
|
JavaScript 开发者 UED
虚拟DOM的原理
虚拟DOM的原理
68 1
|
6月前
|
JavaScript 前端开发 算法
MVVM模型,虚拟DOM和diff算法
1.MVVM是前端开发领域当中非常流行的开发思想。(一种架构模式)目前前端的大部分主流框架都实现了这个MVVM思想,例如Vue,React等2.虽然Vue没有完全遵循MVVM模型,但是Vue的设计也受到了它的启发。Vue框架基本上也是符合MVVM思想的 3.MVVM模型当中尝到了Model和View进行了分离,为什么要分离?
|
6月前
|
前端开发 JavaScript 算法
深入理解前端框架:解析 React 的虚拟 DOM
虚拟 DOM 是 React 前端框架的核心概念之一。本文将深入探讨虚拟 DOM 的原理和应用,帮助读者更好地理解 React 框架的工作机制,并学习如何高效地使用虚拟 DOM 进行前端开发。
101 1
|
6月前
|
JavaScript 前端开发 算法
js开发:请解释什么是虚拟DOM(virtual DOM),以及它在React中的应用。
虚拟DOM是React等前端框架的关键技术,它以轻量级JavaScript对象树形式抽象表示实际DOM。当状态改变,React不直接操作DOM,而是先构建新虚拟DOM树。通过高效diff算法比较新旧树,找到最小变更集,仅更新必要部分,提高DOM操作效率,降低性能损耗。虚拟DOM的抽象特性还支持跨平台应用,如React Native。总之,虚拟DOM优化了状态变化时的DOM更新,提升性能和用户体验。
87 0
|
5月前
|
JavaScript 前端开发 算法
虚拟DOM是React的关键技术,它是个轻量的JS对象树,模拟实际DOM结构。
【6月更文挑战第27天】虚拟DOM是React的关键技术,它是个轻量的JS对象树,模拟实际DOM结构。当状态改变,React不直接修改DOM,而是先构建新的虚拟DOM树。通过 diff 算法比较新旧树,找到最小变更,仅更新必要部分,提高性能,避免频繁DOM操作。虚拟DOM还支持跨平台应用,如React Native。它优化了更新流程,简化开发,并提升了用户体验。
42 1
|
6月前
|
JavaScript 算法 前端开发
虚拟Dom
虚拟Dom
|
6月前
|
JavaScript 前端开发 算法
深入理解虚拟DOM:原理、优势与实践
深入理解虚拟DOM:原理、优势与实践
345 0
|
6月前
|
JavaScript 前端开发 算法
深入探讨前端框架Vue.js中的虚拟DOM机制
本文将深入探讨前端框架Vue.js中的虚拟DOM机制,分析其原理、优势以及在实际开发中的应用场景,帮助读者更好地理解Vue.js框架的核心特性。
|
6月前
|
JavaScript 算法 前端开发
Vue的虚拟DOM:Vue虚拟DOM的工作原理
【4月更文挑战第24天】Vue的虚拟DOM提升渲染性能,通过创建JavaScript对象树(虚拟DOM树)来跟踪DOM变化。当状态改变,Vue用新的虚拟DOM树与旧树对比(diff算法),找到最小DOM操作集合来更新真实DOM。优化策略包括减少状态变化、使用key属性和简化组件结构。理解虚拟DOM工作原理有助于Vue的性能优化。