Skip to content

Latest commit

 

History

History
35 lines (31 loc) · 1.12 KB

p-node.md

File metadata and controls

35 lines (31 loc) · 1.12 KB

伪代码形式简单介绍virtual dom patch算法

patchNode(oldVnode, vnode){
  // 先拿到真实的DOM
  const el = vnode.el = oldVnode.el
  // 分别拿出新旧节点的子元素
  let i,oldCh = oldVnode.children, ch = vnode.children

  // 如果新旧节点相同,直接返回
  if(oldVnode == vnode) retrun

  // 只有文字节点不同
  if(isTextNode(oldVnode) && isTextNode(vnode)){
    if(!isNullOrEmpty(oldVnode) && !isNullOrEmpty(vnode) && oldVnode.text !== vnode.text){
      patchAPI.setTextContent(el, vnode.text)
    }
  }else{
    // 更新属性,绑定事件
    pathAPI.updateElement(oldVnode, vnode)
    // 更新子元素
    // 1. 新旧结点的子元素都存在
    if(oldCh.length > 0 && ch.length > 0){
      pathAPI.updateChildren() => forEach((oldx,x) => pathNode(oldx, x))
    }else if(ch.length > 0){
      // 2.只有新节点有元素
      patchAPI.createEl(vnode) => el.append(createDOM(vnode.children))  
    }else if(oldCh.length > 0){
      // 如果只有旧节点有子元素,那么发生的时新节点删除了子元素
      patchAPI.removeChidren(el) => el.empty()
    }
  }
}