虚拟节点-vnode与真实节点-node转化

  <script>

   // <div id="outer" class="border">content</div> 
        // =>  (转化为虚拟dom)
        // {tag:'div',data:{id:'outer',class:'border'},children:[],value:'content'}
        class VNode{
            /*tag:标签名,
             *value:节点值
             *type:节点类型
             *data:属性组成的对象
             *children:子元素
            */
            constructor(tag,value,type,data){
                this.tag=tag&& tag.toLowerCase();
                this.value=value;
                this.type=type;
                this.data=data;
                this.children=[];
            }
            /*追加子元素--虚拟dom*/
           appendChild(vnode){
               this.children.push(vnode)
           }
        }
        //真实dom转化为虚拟dom
        function getVNode(node){
            var _vnode;
            if(node.nodeType==1){
                // 1.处理属性,将node.attributes伪数组转为对象
                var attrs={};
                for(var i=0,len=node.attributes.length;i<len;i++){
                    var $attr=node.attributes[i];
                    attrs[$attr.nodeName]=$attr.nodeValue;
                }
                //元素节点
                _vnode=new VNode(node.nodeName,undefined,node.nodeType,attrs);
                // 2.处理子元素(递归:将子元素转化为虚拟dom,并添加到父元素中)
                for(var j=0,len=node.childNodes.length;j<len;j++){
                    _vnode.appendChild(getVNode(node.childNodes[j]))
                }
            }else if(node.nodeType==3){
                // 文本节点
                _vnode=new VNode(undefined,node.nodeValue,node.nodeType,undefined);
            }
            return _vnode;
        }
        var root=document.querySelector('#root');
        vnode=getVNode(root);
        // console.log(vnode);

        // 将虚拟dom转化为真实dom
        function parseVNode(vnode){
          var _node;
          if(vnode.type==1){
            // 元素节点
            _node=document.createElement(vnode.tag);
            // 1.处理属性
            Object.keys(vnode.data).forEach((attrName)=>{
              _node.setAttribute(attrName,vnode.data[attrName]);
            })
            // 2.处理子元素
            Object.keys(vnode.children).forEach((subvnode)=>{
              _node.appendChild(parseVNode(vnode.children[subvnode]));
            })
          }else if(vnode.type==3){
            // 文本节点
            _node=document.createTextNode(vnode.value);
          }
          return _node;
        }
        var _node=parseVNode(vnode);
        console.log(_node);

  </script>
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值