手写vue将虚拟 Dom 转化为真实 Dom

vue将虚拟 Dom 转化为真实 Dom

javascript 复制代码
{
  tag: 'DIV',
  attrs:{
  id:'app'
  },
  children: [
    {
      tag: 'SPAN',
      children: [
        { tag: 'A', children: [] }
      ]
    },
    {
      tag: 'SPAN',
      children: [
        { tag: 'A', children: [] },
        { tag: 'A', children: [] }
      ]
    }
  ]
}

把上面虚拟Dom转化成下方真实Dom

<div id="app">
  <span>
    <a></a>
  </span>
  <span>
    <a></a>
    <a></a>
  </span>
</div>
 

实现

javascript 复制代码
// 真正的渲染函数
function _render(vnode) {
  // 如果是数字类型转化为字符串
  if (typeof vnode === "number") {
    vnode = String(vnode);
  }
  // 字符串类型直接就是文本节点
  if (typeof vnode === "string") {
    return document.createTextNode(vnode);
  }
  // 普通DOM
  const dom = document.createElement(vnode.tag);
  if (vnode.attrs) {
    // 遍历属性
    Object.keys(vnode.attrs).forEach((key) => {
      const value = vnode.attrs[key];
      dom.setAttribute(key, value);
    });
  }
  // 子数组进行递归操作
  vnode.children.forEach((child) => dom.appendChild(_render(child)));
  return dom;
}
相关推荐
我命由我123458 分钟前
React - BrowserRouter 与 HashRouter、push 模式与 replace 模式、编程式导航、withRouter
开发语言·前端·javascript·react.js·前端框架·html·ecmascript
Devin_chen20 分钟前
ES6 Class 渐进式详解
前端·javascript
小番茄夫斯基21 分钟前
前端开发的过程中,需要mock 数据,但是走的原来的接口,要怎么做
前端·javascript
Devin_chen21 分钟前
原型链大白话详解
javascript
英俊潇洒美少年1 小时前
Vue3 的 JSX 函数组件,每次更新都会重新运行吗?
前端·javascript·vue.js
kyriewen1 小时前
Generator 函数:那个能“暂停”的函数,到底有什么用?
前端·javascript·面试
进击的尘埃1 小时前
驾驭Skill市场:从3000+技能包中筛出真正能打的20个
javascript
悟空瞎说2 小时前
生产环境Node.js内存泄漏,定位+根治全流程(图文版)
javascript·node.js
是大强2 小时前
Electron 打包用 junction 代替 symlink
前端·javascript·electron
哈__2 小时前
ReactNative项目OpenHarmony三方库集成实战:lottie-react-native
javascript·react native·react.js