返回

Diff算法初学习

//diff算法中的三个主要函数分别为patch,patchVnode,updateChildren
function sameVnode(vnode1, vnode2) {
    // 比较唯一键
    return vnode1.key === vnode2.key && vnode1.sel === vnode2.sel;
}
// 利用虚拟DOM的位置来操作真实DOM
var updateChildren = function(oldCh,newCh) {
    // 如果头头相同,,进入递归,指针右移
    // 如果尾尾相同,进入递归,指针左移
    // 如果头尾相同,,塞到尾后,头右移,尾左移
    // 如果尾头相同,塞到头前,尾左移,头右移
    // 如果都不同,创建新头,塞到头前
    // oldCh遍历完,则把ch没有遍历的元素全部创建,塞到尾后
    // ch遍历完,则把oldCh没有遍历的全部删除
};
// 比对新旧节点
var patchVnode = function(oldVnode, vnode) {
    // 如果是同一节点,无需分析
    if (oldVnode === vnode) {
        return;
} 
// 分析子节点
else{
    let oldChildren = oldVnode.children;
    let children = vnode.children;
    if(!oldChildren) {
        // 将新节点的children全部添加到旧节点
    }
    else if(!children) {
        // 移除所有oldChildren
    }
    // 分析子节点
    else if(oldChildren!==children) {
        updateChildren(oldChildren,children)
    }
}
};
var patch = function(oldVnode, vnode) {
    // 表象相同,进一步分析
    if (sameVnode(oldVnode, vnode)) {
        patchVnode(oldVnode, vnode);
    } else {
        // 将旧节点替换为新节点,销毁旧节点
    }
};