根据node节点生成VNode以及解析成node节点

Posted zdf-xue

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了根据node节点生成VNode以及解析成node节点相关的知识,希望对你有一定的参考价值。

  • 根据node节点来生成一个VNode(vue中是是用字符串模版进行ast抽象树在进行VNode生成)
    /** 虚拟 DOM 构造函数 */
class VNode {
    constructor(tag, data, value, type) {
        this.tag = tag && tag.toLowerCase();
        this.data = data;
        this.value = value;
        this.type = type;
        this.children = [];
    }

    appendChild(vnode) {
        this.children.push(vnode);
    }
}
/**根据node生成一个虚拟DOM树 */
function getVNode(node) {
    let _vnode = null;
    let nodeType = node.nodeType;
    if (nodeType === 3) {
        _vnode = new VNode(undefined, undefined, node.nodeValue, nodeType);
    } else if (nodeType === 1) {
        // 元素
        let nodeName = node.nodeName;
        let attrs = node.attributes; // attrs[ i ] 属性节点 ( nodeType == 2 )
        let attr_obj = {};
        for (let i = 0; i < attrs.length; i++) {
            attr_obj[attrs[i].nodeName] = attrs[i].nodeValue;
        }
        _vnode = new VNode(nodeName, attr_obj, undefined, nodeType);
        // 考虑 node 的子元素
        let childNodes = node.childNodes;
        for (let i = 0; i < childNodes.length; i++) {
            _vnode.appendChild(getVNode(childNodes[i])); // 递归
        }
    }
    return _vnode;
}
  • 根据VNode进行生成node
    /**将vnode转成node */
function parseNode(vnode) {
    let type = vnode.type;
    let _node = null;
    if (type === 3) {
        return document.createTextNode(vnode.value);
    } else if (type === 1) {
        _node = document.createElement(vnode.tag);
        let attrs = vnode.data;
        Object.keys(attrs).forEach(key => {
            _node.setAttribute(key, attrs[key]);
        });

        let childrenVNode = vnode.children
        if (childrenVNode) {
            childrenVNode.forEach(sub => {
                _node.appendChild(parseNode(sub));
            });
        }
        return _node;
    }
}

以上是关于根据node节点生成VNode以及解析成node节点的主要内容,如果未能解决你的问题,请参考以下文章

Vue3 v-for中无key和有key实现的简单解读

vue中diff算法处理新旧节点的流程

Node总结

vue渲染过程解析-VDOM &DOM

应该使用哪个节点将数据从MQTT代理获取到node - red

st_network_paths 仅生成带有单个节点的 node_path