简易 Vue 构建--篇二

1、将 HTML DOM 转换成 js 对象
2、将 js 对象转换成 HTML DOM

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <div id="root">
      <div class="c1">
        <div title="tt1" id="id">hello1</div>
        <div title="tt2">hello2</div>
        <div title="tt3">hello3</div>
        <ul>
          <li>1</li>
          <li>2</li>
          <li>3</li>
        </ul>
      </div>
    </div>
    <script>
      // 如何得到虚拟dom
      // 即:将真实的DOM元素转换成js对象
      // 构建虚拟dom对象
	
	  // 1、将 HTML DOM 转换成 js 对象
      class VNode {
        constructor(tag, data, value, type) {
          this.tag = tag && tag.toLowerCase() // 标签名
          this.data = data // 属性
          this.value = value // 标签内容
          this.type = type // 节点类型
          this.children = [] // 子节点
        }
        // 添加虚拟dom子节点
        appendChild(vnode) {
          this.children.push(vnode)
        }
      }
      // 将真实dom转换成虚拟dom
      function createElement(node) {
        const type = node.nodeType
        let _vnode = null
        if (type === 1) {
          // 标签节点
          const tag = node.nodeName // 标签名
          const attrs = node.attributes // attributes 真实dom里存放标签属性 数组对象
          const data = {} // 虚拟dom中 属性就只是对象
          for (let i = 0; i < attrs.length; i++) {
            data[attrs[i].nodeName] = attrs[i].nodeValue // 数组每一项
          }
          const value = undefined
          _vnode = new VNode(tag, data, value, type)
          const children = node.childNodes
          // 子节点
          for (let i = 0; i < children.length; i++) {
            _vnode.appendChild(createElement(children[i]))
          }
        } else if (type === 3) {
          // 文本节点
          _vnode = new VNode(undefined, undefined, node.nodeValue, type)
        }
        // 将每一个虚拟节点返回
        return _vnode
      }
      const r = createElement(document.querySelector('#root'))
      console.log(r)

	  // 2、将 js 对象转换成 HTML DOM 
      // 将 vNode 转换为真正的 DOM ( 作业 )
      function parseVNode(vnode) {
        let oDom = null
        // 标签节点
        if (vnode.type === 1) {
          oDom = document.createElement(vnode.tag)
          const data = vnode.data
          // 属性节点
          for (let k in data) {
            oDom.setAttribute(k, data[k])
          }
          // 子节点
          for (let i = 0; i < vnode.children.length; i++) {
            oDom.appendChild(parseVNode(vnode.children[i]))
          }
        } else if (vnode.type === 3) {
          // 创建文本节点
          oDom = document.createTextNode(vnode.value)
        }
        return oDom
      }
      const dom = parseVNode(r)
      console.log(dom)
    </script>
  </body>
</html>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值