zoukankan      html  css  js  c++  java
  • diff算法实现

    大致流程
    var vnode = {
      tag: 'ul',
      attrs: {
        id: 'list'
      },
      children: [{
        tag: 'li',
        attrs: {
          className: 'item'
        },
        children: ['item 1']
      },{
        tag: 'li',
        attrs: {
          className: 'item'
        },
        children: ['item 2']
      }]
    }
    function createElement(vnode){
      var tag = vnode.tag;
      var attrs = vnode.attrs || {};
      var children = vnode.children || [];
      if (tag == null) {
        return null;
      }
    
      // 创建真实的 dom 元素
      var elem = document.createElement(tag);
      // 属性
      var attrName;
      for (attrName in attrs) {
        if(attrs.hasOwnProperty(attrName)){
          elem.setAttribute(attrName, attrs[attrName]);
        }
      }
      // 子元素
      children.forEach(function(childVnode){
        elem.appendChild(childElem(childVnode)) // 递归
      });
    
      // 返回真实的 dom 元素
      return elem;
    }

    就是将对象一一转化成dom




    上面是patch的第一个参数没有内容的时候,如果有内容就会做对比。
    var vnode = {
      tag: 'ul',
      attrs: {
        id: 'list'
      },
      children: [{
        tag: 'li',
        attrs: {
          className: 'item'
        },
        children: ['item 1']
      },{
        tag: 'li',
        attrs: {
          className: 'item'
        },
        children: ['item 2']
      }]
    }
    
    var newVnode = {
      tag: 'ul',
      attrs: {
        id: 'list'
      },
      children: [{
        tag: 'li',
        attrs: {
          className: 'item'
        },
        children: ['item 1']
      },{
        tag: 'li',
        attrs: {
          className: 'item'
        },
      children: ['item b']
      }]
    }
    
    
    function updateChildren(vnode ,newVnode){
      var children = vnode.children || [];
      var newChildren = newVnode.children || [];
    
      children.forEach(function(childrenVnode, index){
        var newChildrenVnode = newChildren[index];
        if(childrenVnode.tag === newChildrenVnode.tag){
          // 深层次对比,递归
          updateChildren(childrenVnode, newChildrenVnode);
        } else {
          // 替换
          replaceNode(childrenVnode, newChildrenVnode);
        }
      });
    }
    
    function replaceNode(vnode, newVnode){
      var elem = vnode.elem; // 真实的 dom
      var newElem = newVnode.elem;
    
      // 替换
    }

    没法知道有多少层,就必须用递归

  • 相关阅读:
    认证和授权学习2:springboot中快速使用spring security
    认证和授权学习1基于session的认证授权流程
    activiti学习11历史表和历史查询
    activiti学习10任务监听器的使用
    Vue源码阅读之VNode虚拟DOM(二)
    Vue源码阅读之Vue构造函数(一)
    useEffect使用指南
    从零搭建React+TypeScript的后台项目(三)
    从零搭建React+TypeScript的后台项目(二)
    从零搭建React+TypeScript的后台项目(一)
  • 原文地址:https://www.cnblogs.com/wzndkj/p/11032294.html
Copyright © 2011-2022 走看看