虚拟Dom

简介: 虚拟Dom

前言

虚拟Dom想必大家并不陌生,这是我学习虚拟Dom的一篇笔记,作为一个记录。

<div id="app">
      <div>test</div>
      <div>
        <span>123</span>
      </div>
</div>

这是我们常规的Dom结构,那么想要表示这个Dom结构,用虚拟Dom应该怎么表示呢?

VirtualElement

我们知道Dom节点打印出来是一个对象,所以我们可以用JavaScript中的对象来描述Dom节点。来一个“虚拟节点”的构造函数。

function VirtualElement(tagName, props, children) {
    this.tagName = tagName
    this.props = props || {}
    this.children = children || []
}

这里只考虑了最简单的情况,就是节点的标签、属性和它子节点。那么我们就可以这样来描述上述的Dom结构。

let vdom = new VirtualElement("div", { id: "app" }, [
        new VirtualElement("div", {}, ["test"]),
        new VirtualElement("div", {}, [new VirtualElement("span", {}, ["123"])
]);

在控制台中打印如下 6.png


Render

接下来就把他渲染成真正的Dom,我们在他的原型上定义一个方法。

VirtualElement.prototype.render = function () {}

接着拿到属性

const tagName = this.tagName;
const props = this.props || {};
const children = this.children || [];

然后用document.createElement()生成一个真实的Dom节点

let tag = document.createElement(tagName)

处理属性

    let propKeys = Object.keys(props)
    if (propKeys.length > 0) {
        propKeys.forEach(item => {
            tag.setAttribute(item, props[item])
        })
    }

递归处理子节点

    if (children.length > 0) {
        children.forEach(item => {
            let childTag
            if (item instanceof VirtualElement) {
                childTag = item.render()
            } else {
                childTag = document.createTextNode(item)
            }
            tag.appendChild(childTag)
        })
    }
    return tag

来试一下挂载

```
 <div id="container"></div>```
<script>
 let container = document.getElementById("container");
      let vdom = new VirtualElement("div", { id: "app" }, [
        new VirtualElement("div", {}, ["test"]),
        new VirtualElement("div", {}, [new VirtualElement("span",{}, ["123"]) ]) ]);
    setTimeout(()=>{
    container.appendChild(vdom.render())
},2000)
</script>

7.png 链接



diff算法我写不出来。。。留下没有技术的泪水。好了下班了溜了

相关文章
|
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:原理、优势与实践
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的性能优化。
|
6月前
|
JavaScript 算法 API
解释 Vue 的虚拟 DOM 及其优势。
解释 Vue 的虚拟 DOM 及其优势。
77 2