题解 | #虚拟DOM#

虚拟DOM

https://www.nowcoder.com/practice/a283d2c284ed49468c3b0f6ec0312b0f

思路:首先使用{tag,props,text,children}析构vnode,再判断tag是否为undefined,如果没有标签则直接使用createTextNode方法创建文本节点并返回,反之使用createElement方法创建tag标签元素,并遍历props对象,使用setAttribute方法为元素设置属性,再遍历子元素数组,依次递归创建子元素,并使用appendChild方法挂载在父元素上,最后返回当前元素即可。

<script>
   var vnode = {
      tag: 'ul',
      props: {
        class: 'list'
      },
      text: '',
      children: [
         {
            tag: "li",
            props: {
              class: "item"
            },
            text: '',
            children: [
                 {
                     tag: undefined,
                     props: {},
                     text: '牛客网',
                     children: []
                  }
             ]
          },
          {
              tag: "li",
              props: {},
              text: '',
              children: [
                   {
                       tag: undefined,
                       props: {},
                       text: 'nowcoder',
                       children: []
                   }
               ]
            }
         ]
     }
     const _createElm = vnode => {
        //析构vnode
        const {tag,props,text,children} = vnode
        //如果为空节点则直接创建文本节点并返回
        if(tag==undefined)
          return document.createTextNode(text)
        //否则创建tag元素
        const el=document.createElement(tag)
        //为节点添加属性
        for(let key in props)
          el.setAttribute(key,props[key])
        children.forEach(item=>{
          //将子元素挂载到父元素上
        el.appendChild(_createElm(item))
     })
     return el
   }
</script>

总结:createTextNode(文本)用于创建文本节点;createElement(标签)方法创建tag标签元素;setAttribute(键,值)方法为元素设置属性;父元素.appendChild(子元素)为父元素添加子元素。

#虚拟DOM#
前端js面试 文章被收录于专栏

前端js面试,帮助你更好的理解js。

全部评论

相关推荐

弦五Strings:他之所以会举报你代课是因为在这种人眼里正常上课就是正义代课就是邪恶,典型二极管思维,处理方法就是私下沟通,你就说你自己家里经济困难或者家里父母生病什么之类的,需要去打工挣钱,用尽孝的正义对冲他认为的上课的正义,他可能就妥协了。
我的实习日记
点赞 评论 收藏
分享
07-18 14:55
门头沟学院 Java
点赞 评论 收藏
分享
评论
4
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务