当前位置: 首页 > 网络应用技术

反应原理的差异算法根本不难!

时间:2023-03-06 01:32:20 网络应用技术

  差异算法听起来很深刻。确实并不那么困难。

  仅在传统DOM中只有真正的DOM↓

  这些东西是我们可以看到的真正的dom,即节点元素。↓

  在添加了一个概念的组件框架之后,添加了一个概念,即虚拟dom。因此,在传统浏览器和真实的dom.virtual dom layer.virtual dom layer中添加了图层。这就是这样的↓

  虚拟DOM只是一个对象!IntersectionIntersectionno难度,虚拟DOM只是一个对象。这只是此内容,我们看不到它在视图上,它在源代码中。

  让我们以真实DOM的一部分映射与之对应的虚拟DOM↓

  Vnode的这个对象是React中虚拟DOM的真实面。

  因为它太大了,无法从刮擦中产生一个正面的DOM节点!从浏览器中进行截面引导,无法为该节点创建一个完全呈现到视图的节点的节点,因此它会消耗更多的性能。当需要创建和渲染一组节点时,肉眼可见的口吃出现在极端情况下。虚拟DOM的作用是最大程度地减少元素的创建。

  让我们有一个简单的过程来解释它

  观察上面的DOM节点一个和DOM节点二,并不难找到。如果重新启动浏览器,则浏览器将在没有虚拟DOM的情况下这样做

  观察三个步骤,其中最昂贵的是创建节点的过程。

  在使用虚拟DOM的情况下。更新视图将具有以下操作↓

  那很明显。

  不使用虚拟DOM,即使只有一个子节点会更改,也需要重新启动所有节点。

  在使用虚拟DOM的情况下,可以重复使用的许多不变的节点(或组件),节省了许多创建节点的步骤。因此,虚拟DOM将带来性能改善。

  这很简单。在虚拟DOM中,将有两棵树,一棵修订的树和一棵修改的树。

  在React中,差异有三种主要策略。

  组件差异(组件比较)

  元素差异(元素比较)

  比较将从树差异(树比)开始,将组件与组件扫描到组件差异中,并在清除元素时输入元素diff。这是递归查询的过程。

  首先,DIFF将在同一级别上比较两棵古老和老树。永远不会进行交叉比较。

  发现一层的比较是不同的,下层的节点将直接删除而无需进行比较。

  更有趣的是↓

  当模块树在上图中发生变化时,从人类的思维中,应该是删除P元素并将跨度元素移至左侧。

  但是机器不明白!

  就机器理解而言,差异算法将提供以下示例

  换句话说,如果删除第一个元素,则所有后续元素将被删除,然后重新创建。

  基于机器的笨重思考。

  钥匙诞生了。

  老实说。钥匙是标记。

  没有使用键,机器的默认算法是按顺序比较它们(请注意,以元素的顺序比较奥运会)。只要相应顺序中的元素类型不正确,请删除它直接重建。

  但 !!密钥的使用是不同的。使用密钥机将打开另一种比较算法。

  当虚拟DOM找到一个节点时,有一个键。他不会在旧节点树中比较相同的位置。存在。它可以重复使用。

  不要使用关键情况

  如上图所示,无需使用键。将根据元素的位置比较diff算法。如果您像上面的图片一样删除第一个元素,则将由于不成功的比较而删除后续元素,然后再删除。创建。

  如果使用键

  在使用密钥的情况下,将会有一些元素可以在旧节点树中重复使用。这可以避免不必要的性能浪费。

  原始:https://juejin.cn/post/7113124543136268295