首页 > 编程语言 >Diff算法(面试)

Diff算法(面试)

时间:2022-10-31 16:23:53浏览次数:44  
标签:遍历 DOM 补丁 更新 面试 算法 组件 Diff 节点

Diff 算法探讨的就是虚拟 DOM 树发生变化后,生成 DOM 树更新补丁的方式。对比新旧两株虚拟 DOM 树的变更差异,将更新补丁作用于真实 DOM,以最小成本完成视图更新。

 

具体流程:

  1. 真实 DOM 与虚拟 DOM 之间存在一个映射关系。这个映射关系依靠初始化时的 JSX 建立完成;
  2. 当虚拟 DOM 发生变化后,就会根据差距计算生成 patch,这个 patch 是一个结构化的数据,内容包含了增加、更新、移除等;
  3. 最后再根据 patch 去更新真实的 DOM,反馈到用户的界面上。

这里涉及3个要点:

  1. 更新时机:更新发生在setState、Hooks 调用等操作以后
  2. 遍历算法:采用深度优先遍历,从根节点出发,沿着左子树方向进行纵向遍历,直到找到叶子节点为止。然后回溯到前一个节点,进行右子树节点的遍历,直到遍历完所有可达节点
  3. 优化策略:树、组件及元素三个层面进行复杂度的优化
    1. 忽略节点跨层级操作场景,提升比对效率。
      1. 这一策略需要进行树比对,即对树进行分层比较。树比对的处理手法是非常“暴力”的,即两棵树只对同一层次的节点进行比较,如果发现节点已经不存在了,则该节点及其子节点会被完全删除掉,不会用于进一步的比较,这就提升了比对效率
    2. 如果组件的 class 一致,则默认为相似的树结构,否则默认为不同的树结构
      1. 在组件比对的过程中:如果组件是同一类型则进行树比对;如果不是则直接放入补丁中。只要父组件类型不同,就会被重新渲染。这也就是为什么shouldComponentUpdate、PureComponent 及 React.memo 可以提高性能的原因
    3. 同一层级的子节点,可以通过标记 key 的方式进行列表对比
      1. 元素比对主要发生在同层级中,通过标记节点操作生成补丁。节点操作包含了插入、移动、删除等。其中节点重新排序同时涉及插入、移动、删除三个操作,所以效率消耗最大,此时策略三起到了至关重要的作用。通过标记 key 的方式,React 可以直接移动 DOM 节点,降低内耗

标签:遍历,DOM,补丁,更新,面试,算法,组件,Diff,节点
From: https://www.cnblogs.com/LIXI-/p/16844727.html

相关文章

  • 第四届全国大学生算法设计与编程挑战赛(秋季赛)正式赛题解
    没时间写题解了,随便写两笔吧,看不懂可以联系QQ160042137901(Easy)直接暴力枚举每个状态及其所有转移,时间复杂度\((T2^nn^2)\)。02(Easy)二分答案,用一个单调队列或者优先......
  • Vue面试题
    1、Vue的生命周期?beforeCreate、created、beforeMount、mounted、beforeUpdate、updated、beforeDestroy、destroyed(创建、挂载、更新、卸载)挂载中可以操作DOM,创建中不......
  • 算法导论(第23章 最小生成树)
    目录23.1最小生成树的形成23.2\(Kruskal\)算法和\(Prim\)算法\(Kruskal\)算法\(Prim\)算法问题描述:对于一个连通无向图\(G=(V,E)\),为其每条边\((u,v)\inE\),赋予权......
  • 框架面试题
    1.请简述mybatis加载mapper的映射文件的三种方式第一种:(包扫描)         通过资源路径的加载,利用mapper标签的resource的属性进行资源路径加载第二种:(引用......
  • 文件更小,质量更高,大火的Stable Diffusion还能压缩图像?
    文件更小,质量更高,大火的StableDiffusion还能压缩图像?代码:code......
  • Java算法基础 - 单链表详解(文末有配套视频)
    导航​​步骤1只用Java类能实现吗?​​​​步骤2类里面有顾客属性​​​​步骤3排队打饭​​​​步骤4从一个顾客联系到另一个顾客​​​​步骤5加一个next字段​......
  • 力扣HOT100算法题5:最长回文字串
    文章目录​​一、题目​​​​二、方法一:解题思路​​​​三、方法一:代码解析​​​​四、方法二:动态规划​​​​五、方法二:代码解析​​一、题目给你一个字符串s,找到s......
  • 实验二 逻辑回归算法实验
    【实验目的】理解逻辑回归算法原理,掌握逻辑回归算法框架;理解逻辑回归的sigmoid函数;理解逻辑回归的损失函数;针对特定应用场景及数据,能应用逻辑回归算法解决实际分类问题。......
  • 这个面试题居然从11年前就开始讨论了,而官方今年才表态。
    大家好,我是歪歪。这期给大家盘一个面试题啊,就是下面的第二题。这个面试题的图片都被弄的有一点“包浆”了。所以为了你的观感,我还是把第二道题目手打一遍。啧啧啧,这行......
  • 机器学习的发展(初级算法梳理一)
    2016年3月,阿尔法围棋与围棋世界冠军、职业九段棋手李世石进行围棋人机大战,以4比1的总比分获胜.深度学习开始进行大众的视野中.深度学习其实是机器学习的一个分支,我们今天......