随笔 - 175  文章 - 6  评论 - 0  阅读 - 36429

③ 实现Virtual DOM的下一个VNode节点

1 什么是VNode?

render function 会被转化成 VNode 节点

1.1 Virtual DOM

一个结构类似于真实 DOM 的 js 对象

1.2 实现一个简单的 VNode 类,加入一些基本属性

class VNode {
    constructor (tag, data, children, text, elm) {
        // 当前节点的标签名
        this.tag = tag;
        // 当前节点的一些数据信息
        this.data = data;
        // 当前节点的文本
        this.text = text;
        // 当前虚拟节点对应的真实DOM
        this.elm = elm;
    }
}

栗子

1. Vue组件
<template>
	<span class="demo" v-show="isShow">
		This is a span.
	</span>
</template>
2. 用 js 代码形式表示该 Vue 组件
function render () {
    return new VNode(
    	'span',
    	{
            // 指令集合数组
            directives: [
                {
                    // v-show指令
                    rawName: 'v-show',
                    expression: 'isShow',
                    name: 'show',
                    value: true
                }
            ],
            // 静态class
            staticClass: 'demo'
    	},
    	[new VNode(undefined, undefined, undefined, 'This is a span.')]
    );
}
3. 转换成 VNode
{
    tag: 'span',
    data: {
        // 指令集合数组
        directives: [
            {
                rawName: 'v-show',
                expression: 'isShow',
                name: 'show',
                value: true
            }
        ],
        // 静态class
        staticClass: 'demo'
    },
    text: undefined,
    children: [
    	// 子节点是一个文本VNode节点
        {
            tag: undefined,
            data: undefined,
            text: 'This is a span.',
            children: undefined
        }
    ]
}

1.3 生成常用 VNode 的方法封装

1. 创建一个空节点

function createEmpty VNode () {
    const node = new VNode();
    node.text = '';
    return node;
}

2. 创建一个文本节点

function createTextVNode (val) {
    return new VNode(undefined, undefined, undefined, String(val));
}

3. 克隆一个 VNode 节点

function cloneVNode (node) {
    const cloneVnoed = new VNode(
    	node.tag,
    	node.data,
    	node.children,
    	node.text,
    	node.elm
    );
    return cloneVnode;
}

1.4 总结

  • VNode 就是一个 js 对象,用 js 对象的属性来描述当前节点的一些状态,用 VNode 节点的形式模拟一棵 Virtual DOM
posted on   pleaseAnswer  阅读(71)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示