首页 > 编程语言 >详细讲一下Vue2.x,Vue3.x,React的Vdom和Diff算法

详细讲一下Vue2.x,Vue3.x,React的Vdom和Diff算法

时间:2024-12-25 13:02:24浏览次数:5  
标签:Vue const newIdx React oldFiber Vue2 Vue3 null

1.Vue 的 vdom和Diff

1.1. Vue 的实现:

// Vue 2.x 的 VNode 结构
{
    tag: 'div',         // 标签名
    data: {             // 节点数据
        class: 'container',
        attrs: { id: 'app' },
        on: { click: handler }
    },
    children: [],       // 子节点
    text: undefined,    // 文本内容
    elm: undefined,     // 对应的真实 DOM 节点
    context: vm,        // Vue 实例
    key: undefined      // 节点的 key 属性
}

// Vue 3.x 的优化
const vnode = {
    type: 'div',
    props: { class: 'container' },
    children: [],
    component: null,
    key: null,
    shapeFlag: ShapeFlags.ELEMENT
}

1.2.Vue 的 Diff 算法特点:

// 四个指针
let oldStartIdx = 0
let oldEndIdx = oldChildren.length - 1
let newStartIdx = 0
let newEndIdx = newChildren.length - 1

while (oldStartIdx <= oldEndIdx && newStartIdx <= newEndIdx) {
    if (sameVnode(oldStartVnode, newStartVnode)) {
        // 头部节点相同
        patchVnode(oldStartVnode, newStartVnode)
    } else if (sameVnode(oldEndVnode, newEndVnode)) {
        // 尾部节点相同
        patchVnode(oldEndVnode, newEndVnode)
    } else if (sameVnode(oldStartVnode, newEndVnode)) {
        // 旧头新尾
        patchVnode(oldStartVnode, newEndVnode)
        // 移动节点
    } else if (sameVnode(oldEndVnode, newStartVnode)) {
        // 旧尾新头
        patchVnode(oldEndVnode, newStartVnode)
        // 移动节点
    } else {
        // 查找、移动或创建节点
    }
}

1.3 Vue 3 的优化:

// 静态标记
const hoisted = createVNode('div', null, 'static content')
function render() {
    return hoisted
}

// Fragments
const Fragment = Symbol('Fragment')
const fragment = {
    type: Fragment,
    children: []
}

2.React 的Vdom和Diff

2.1 React 的实现:

// React 的 VDOM 结构
{
    type: 'div',
    props: {
        className: 'container',
        children: []
    },
    key: null,
    ref: null,
    $$typeof: Symbol.for('react.element')
}

// Fiber 节点结构
{
    type: 'div',
    key: null,
    stateNode: HTMLDivElement,
    child: FiberNode,
    sibling: FiberNode,
    return: FiberNode,
    pendingProps: {},
    memoizedProps: {},
    updateQueue: []
}

2.2 React 的 Diff 算法特点:单向遍历

function reconcileChildrenArray(
    returnFiber: Fiber,
    currentFirstChild: Fiber | null,
    newChildren: Array<any>
) {
    let oldFiber = currentFirstChild;
    let newIdx = 0;
    let previousNewFiber = null;

    // 第一轮:处理更新的节点
    for (; oldFiber !== null && newIdx < newChildren.length; newIdx++) {
        if (oldFiber.index > newIdx) {
            nextOldFiber = oldFiber;
            oldFiber = null;
        } else {
            nextOldFiber = oldFiber.sibling;
        }
        const newFiber = updateSlot(
            returnFiber,
            oldFiber,
            newChildren[newIdx]
        );
        if (newFiber === null) {
            break;
        }
        // ... 处理更新
    }

    // 第二轮:处理剩余节点
    if (newIdx === newChildren.length) {
        // 删除剩余旧节点
        deleteRemainingChildren(returnFiber, oldFiber);
        return resultingFirstChild;
    }
    if (oldFiber === null) {
        // 添加剩余新节点
        for (; newIdx < newChildren.length; newIdx++) {
            const newFiber = createChild(
                returnFiber,
                newChildren[newIdx]
            );
            // ... 处理新建
        }
    }
}

3.Vue vs React 对比:

3.1:性能优化策略:

// Vue
// 1. 静态节点提升
const staticNode = createVNode('div', null, 'static')

// 2. 响应式系统优化
const state = reactive({
    count: 0
})

// React
// 1. memo 优化
const MemoComponent = React.memo(({ value }) => {
    return <div>{value}</div>
})

// 2. useMemo 优化
const memoizedValue = useMemo(() => computeValue(a, b), [a, b])

3.2 主要区别:

  • 更新粒度:
  • Vue:基于响应式系统,可以精确追踪组件的依赖关系
  • React:自顶向下的递归比较,需要手动优化
  • Diff 算法:
  • Vue:双端比较 + 最长递增子序列
  • React:单向遍历 + Fiber 架构
  • 静态优化:
  • Vue:编译时优化,静态提升
  • React:运行时优化,手动 memo
  • 更新机制:
  • Vue:响应式触发,异步更新队列
  • React:setState 触发,Fiber 调度
  • 性能优化:
  • Vue:自动依赖收集,编译优化
  • React:手动优化,memo/useMemo/useCallback

选择建议:

        需要精确更新:选择 Vue

        需要灵活控制:选择 React

  • 小型应用:Vue 更简单
  • 大型应用:两者都可以

这就是 Vue 和 React 在 Virtual DOM 和 Diff 算法上的主要区别。两者都有其优势,选择哪个主要取决于具体需求和团队情况。

标签:Vue,const,newIdx,React,oldFiber,Vue2,Vue3,null
From: https://blog.csdn.net/m0_73574455/article/details/144674210

相关文章

  • vue3 - vite 对于是否生成 xxx.js.map文件的开关设置-总结
    有3个办法可以设置不生成map文件1.package.json文件里的打包语句"build:docker":"vue-tsc--noEmit&&vitebuild--modedev",中,添加--noEmit参数,则不会生成map包2.vite.config.ts文件里的build.sourcemap属性,设置为false,则不会生成map包3.tsconfig.json文件里的c......
  • RenderBufferLoadAction, RenderBufferStoreAction
    什么地方用到? CommandBuffer的SetRenderTarget(renderTargetId, loadAction,storeAction)函数 RenderBufferLoadAction 用个例子说明:有两个RenderTexture A和B,在A上绘制一个红色三角形->在B上绘制一个蓝色矩形-> 在A上绘制一个黄色菱形RenderBufferLoadAction.L......
  • Python+Vue3+Django银行信用卡额度管理系统的设计与实现
    文章目录具体实现截图项目介绍和开发技术介绍开发技术核心代码部分展示项目结构分析文章目录/写作提纲参考源码/演示视频获取方式具体实现截图项目介绍和开发技术介绍创新之处(1)系统资源闭环整合,实现了综合功能高度集成。(2)采用DJANGO框架,开发软件更加方便、......
  • Python+Vue3+Django新闻发布管理系统设计与实现
    文章目录具体实现截图项目介绍和开发技术介绍开发技术核心代码部分展示项目结构分析文章目录/写作提纲参考源码/演示视频获取方式具体实现截图项目介绍和开发技术介绍创新之处(1)系统资源闭环整合,实现了综合功能高度集成。(2)采用DJANGO框架,开发软件更加方便、......
  • 医院食堂订餐系统Python+Vue3+Django(Pycharm毕业设计 mysql)
    文章目录具体实现截图项目介绍和开发技术介绍开发技术核心代码部分展示项目结构分析文章目录/写作提纲参考源码/演示视频获取方式具体实现截图项目介绍和开发技术介绍创新之处(1)系统资源闭环整合,实现了综合功能高度集成。(2)采用DJANGO框架,开发软件更加方便、快......
  • Electron+Vue3实现源代码生成器
    Electron+Vue3实现源代码生成器开源项目地址功能实现存在问题开源项目地址gitee链接:传送门github链接:传送门功能实现根据用户选择的文件夹,生成指定后缀名的TXT源代码文档,效果如下:初始页面选择文件夹,添加后缀名后生成成功后生成效果存在问题因为是第......
  • Taipy是个好神器!Python+Flask+ React快速构建 AI Web 应用的利器
    随着人工智能在各行业的应用越来越广泛,开发快速、高效的AIWeb应用成为众多互联网企业和开发者共同需求。Taipy,作为一个专为Python数据和AIWeb应用构建而生的工具,正迅速赢得大家的青睐。无论是算法专家还是开发新手,Taipy都提供了简洁高效的解决方案,让AIWeb应用......
  • Vue2环境中AntDeisgn1.x的树形下拉选择组件
    示例相关代码<a-tree-select v-model="type" show-search style="width:100%" :dropdown-style="{maxHeight:'400px',overflow:'auto'}" placeholder="请选择" allow-clear ......
  • 基于React+Nextjs+Nodejs开发的web3入门项目
    这是一个学习Web3技术的练习项目。oneNFS是一个音乐创作Web3平台。我们利用区块链技术和先进的加密技术,为艺术家和听众创建一个公平、透明、以用户为中心的生态系统。源码地址:https://github.com/geeeeeeeek/oneNFS演示地址:https://one-nfs.vercel.app/主要功能......
  • 常用vue3脚手架配置流程
    我目前看到的脚手架搭建,多多少少都有点问题。我目前创建了很多项目,已经习惯了以下一套流程,下面总结一下:一、创建vite项目npmcreatevite@latestnpminstallnpmrundev二、安装elementplusnpminstallelement-plus--savenpminstall-Dunplugin-vue-componentsunpl......