首页 > 其他分享 >手写虚拟dom转真实dom

手写虚拟dom转真实dom

时间:2023-01-04 01:00:35浏览次数:30  
标签:render dom tag vnode 虚拟 key 手写 children


/**
* vnode转化成真实DOM,实现思路
* 1. render函数,render(vnode, container)
* 2. createDom,根据参数创建对应的标签
* 3. 根据属性,新建还是更新,如果有children,则递归render
* 4. 更新属性:style, 则更改style上的attr,其他类型,则是修改对象上的属性
*/
// 虚拟dom转真实dom
const vnode = {
  tag: 'div',
  attrs: {
     id: 'app',
  },
  children: [{
      tag: 'span',
      children: [{
      tag: 'a',
      children: [],
  }],
  },
  {
    tag: 'span',
    children: [{
       tag: 'a',
       children: [],
        },
        {
          tag: 'a',
          children: [],
        },
    ],
 },
 ],
}
render(vnode, document.querySelector('#root'))

function render(vnode, container){
let dom = createDom(vnode)
container.appendChild(dom)
}
function createDom(vnode){
// 节点上有啥属性?
   const {tag, attrs, children} = vnode
let dom = document.createElement(tag)

if(typeof attrs === 'object'){
updateProps(dom, {}, attrs)
}

if(children.length > 0){
  reconcilrChildren(children, dom)
}
  return dom
}

function reconcilrChildren(childrenDom, parentDom){
  for(let i = 0; i < childrenDom.length; i++){
  render(childrenDom[i], parentDom)
  }
}

function updateProps(dom, oldprops = {}, newProps = {}){
  for(const key in newProps){
  // 新的属性,直接赋值
  if(key === 'style'){
    // style
    let styleObj = newProps[key]
    for(let attr in styleObj){
    dom.style[attr] = styleObj[attr]
    }
    }else {
    dom[key] = newProps[key]
    }
  }

  // 老的属性,需要删除
   for(let key in oldprops){
    // 如果在新的属性中不存在老的属性,则删除
    if(!newProps.hasOwnProperty(key)){
    delete dom[key]
    }
  }
}

标签:render,dom,tag,vnode,虚拟,key,手写,children
From: https://www.cnblogs.com/yiyunh/p/17023805.html

相关文章

  • js手写缓存累积
    //实现累乘缓存//缓存输出1,2,3下次2,3,1也能直接获取结果functionmultiplicationCatch(){letmap={}returnfunction(...params){//排序之后,内......
  • 创建python虚拟环境
    安装pipinstallvirtualenvcd到指定目录virtualenv目录名--python==python3.7 ---如何激活python进入scripts目录,执行该文件   ---给虚拟环境安装dj......
  • js有关dom操作学习
    dom对象就是操作网页的documentdom节点:整个文档是一个文档节点(document对象)每个HTML元素是元素节点(element对象)HTML元素内的文本是文本节点(text对象......
  • Window下安装centos虚拟机
    1.下载virtualbox软件,安装virtualbox(一直下一步就行)。官网下载地址:https://www.virtualbox.org/wiki/Downloads   安装时可能提示”MicrosoftVisualC++“版本......
  • laravel生成PDF使用插件barryvdh/laravel-dompdf及中文乱码问题解决
    使用1.composer安装composerrequirebarryvdh/laravel-dompdf2.发布配置文件,生成的配置文件config/dompdf.php,也可选择忽略此步骤phpartisanvendor:publish......
  • 【Ubuntu】Ubuntu安装python虚拟环境
    1.准备环境Ubuntu20.04LTS1.1安装virtulenv和virtulenvwrappersudopip3installvirtulenvsudopip3installvirtulenvwrapper1.2配置虚拟环境存放目录先在$HOM......
  • 基于Linux下的虚拟机安装详解
    首先我们打开一个shell切换到超级用户,输入如下命令:[kiosk@foundation21Desktop]$pwd/home/kiosk/Desktop[kiosk@foundation21Desktop]$su-rootPassword:Lastlogin:F......
  • 【Leetcode】天堂硅谷·数字经济算法编程大赛(虚拟)
    感受题目清单​​​https://leetcode.cn/contest/hhrc2022/​​周末比较忙,两场比赛都没有参加,打的虚拟赛。题解A.化学反应实验室内有一些化学反应物,其中的任意两种反应物......
  • 用Xftp给linux虚拟机传输文件时失败:Permission is not allowed!
    一直提示错误:点开发现了传输错误信息 Permissionisnotallowed!意思就是权限不够,那就到虚拟机更改该文件夹的权限。sudochmod777opt ......
  • 虚拟DOM
    一、对虚拟DOM的理解虚拟DOM就是用来描述真实DOM的javaScript对象,可以将多次修改的DOM一次性渲染到页面上,减少页面的重排重绘,提高渲染性能虚拟DOM就是用来描述真实DOM......