首页 > 编程语言 >vue3 虚拟dom与diff算法

vue3 虚拟dom与diff算法

时间:2023-07-06 16:37:09浏览次数:48  
标签:const dom 算法 key vue3 diff c1 c2

diff算法

vue3 diff算法原码地址:  https://github.com/vuejs/core

1. diff 算法主要是说renderer.ts中patchChildren这段代码逻辑,如下:

 

 2. diff算法排序分为无key时diff算法排序逻辑和有key时diff算法排序逻辑

 2.1 无key时diff算法排序逻辑, 分为三步如下,如图1中无key: 

  * 通过for循环patch重新渲染元素,来替换

  * 删除

      * 新增

const patchUnkeyedChildren = (
    c1: VNode[],
    c2: VNodeArrayChildren,
    container: RendererElement,
    anchor: RendererNode | null,
    parentComponent: ComponentInternalInstance | null,
    parentSuspense: SuspenseBoundary | null,
    isSVG: boolean,
    slotScopeIds: string[] | null,
    optimized: boolean
  ) => {
    c1 = c1 || EMPTY_ARR
    c2 = c2 || EMPTY_ARR
    const oldLength = c1.length
    const newLength = c2.length
    const commonLength = Math.min(oldLength, newLength)
    let i
    for (i = 0; i < commonLength; i++) {
      const nextChild = (c2[i] = optimized
        ? cloneIfMounted(c2[i] as VNode)
        : normalizeVNode(c2[i]))
        //1. 循环patch替换
      patch(
        c1[i],
        nextChild,
        container,
        null,
        parentComponent,
        parentSuspense,
        isSVG,
        slotScopeIds,
        optimized
      )
    }
    //2.  删除
    if (oldLength > newLength) {
      // remove old
      unmountChildren(
        c1,
        parentComponent,
        parentSuspense,
        true,
        false,
        commonLength
      )
    } else {
      //3.  新增
      // mount new
      mountChildren(
        c2,
        container,
        anchor,
        parentComponent,
        parentSuspense,
        isSVG,
        slotScopeIds,
        optimized,
        commonLength
      )
    }
  }

 2.2 keydiff算法排序逻辑分为五步如下:

  * 前序算法前面元素与前面元素比较如 isSameVNodeType,如果不一样,跳出循环

    * 尾序算法尾和尾比较,如果不一样,跳出循环

    * 新节点如果多出来就挂载(新增)

 * 旧节点如果多出来就卸载(删除)

 * 乱序

图1

参考文章: https://xiaoman.blog.csdn.net/article/details/122778560?spm=1001.2014.3001.5502

标签:const,dom,算法,key,vue3,diff,c1,c2
From: https://www.cnblogs.com/TheYouth/p/17532528.html

相关文章

  • 1.Vue3 配置开发-测试环境
    1、根目录新建.env.testing、.env.donline文件2、package.json=》scripts中配置"start":"vue-cli-serviceserve--modetesting","start-o":"vue-cli-serviceserve--modedonline"3、vue.config.jsconstBundleAnalyzerPlugin=require(&......
  • 使用Stable Diffusion生成艺术二维码
    在数字艺术的世界中,二维码已经从单纯的信息承载工具转变为可以展示艺术表达的媒介。这是通过使用StableDiffusion的技术实现的,它可以将任何二维码转化为独特的艺术作品。接下来,我们将一步步教你如何使用StableDiffusion生成艺术二维码。需要的工具你需要一款名为AUTOMATIC1111......
  • 【12.0】前端基础JavaScript之DOM
    【12.0】前端基础JavaScript之DOM【一】什么是DOM/BOM截至目前为止,我们虽然已经学会了js语法,但是还是没办法跟浏览器进行交互BOM(BrowserObjectModel)浏览器对象模型js代码操作浏览器DOM(DocunmentObjectModel)文档对象模型js代码操作标签【二】Window......
  • 10:vue3 组件注册方式(全局注册和局部注册)
    组件注册方式一个Vue组件在使用前需要先被“注册”,这样Vue才能在渲染模板时找到其对应的实现。组件注册有两种方式:全局注册和局部注册。全局注册将09节课程的Header组件进行全局注册演练在main.js中添加Header.vue组件的注册1import{createApp}from'vue'2impo......
  • vue3子组件向父组件传参
    《好记性不如烂笔头系列》子组件<template><divclass="protocolstyle"><van-checkboxv-model="checked"toggle@click="userProtocolClick"></van-checkbox><spanclass="marginL5">测试数据</span......
  • 09: vue3 组件嵌套关系
    组件嵌套关系组件允许我们将UI划分为独立的、可重用的部分,并且可以对每个部分进行单独的思考。在实际应用中,组件常常被组织成层层嵌套的树状结构:这和我们嵌套HTML元素的方式类似,Vue实现了自己的组件模型,使我们可以在每个组件内封装自定义内容与逻辑。创建组件及引用关系......
  • 在asp.net core中使用vue3+vite(起)
    前言一开始是一个自用的应用,原本是用razor写的。最近有了点新想法,加点新功能,但是我接触的项目基本都是vue+api的前后端分离,用这razor写的是真不习惯,最后决定还是用习惯的vue重写。之前尝试过在.netcore里使用vue2+webpack,毕竟实际上就是把.vue翻译成了.js来用,一个站点就能跑。......
  • 08:vue3 组件基础
    定义一个组件在components文件夹下新建MyComponent.vue组件 写入下面代码1<script>2exportdefault{3data(){4return{5count:06}7}8}9</script>1011<template>12<button@click="count++">我被点击了{......
  • 古风修仙美少女-InsCode Stable Diffusion 美图活动一期
    StableDiffusion模型在线使用地址:https://inscode.csdn.net/@inscode/Stable-Diffusion点我直接前往大家直接点击上面链接就是,如果自己主页打开,还容易找不到这个模型哦一.基本介绍1.背景介绍InsCode是一个集成了在线IDE、在线AI编程、在线大模型训练以及SD模型使用的综......
  • 判断语句+ random的应用-剪刀石头布游戏
    1'''2需求:31.通过人机交换实现您的出拳(input函数的应用)42.通过伪随机数模块random实现模拟对手出拳53.然后进行数据处理,得出结果64.输入数字非0、1、2退出7'''89importrandom#导入随机数模块random1011whileTrue:12#人机交换:pla......