首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

React面试:谈谈虚拟DOM,Diff算法与Key机制_2023-02-27

然后给每个节点生成一个唯一标志: 图片 在遍历过程,每遍历到一个节点,就将新旧两棵树作比较,并且只对同一级别的元素进行比较: 图片 也就是只比较图中用虚线连接起来部分,把前后差异记录下来。...react diff算法通过新旧节点比较后,如果发现了key相同新旧节点,就会执行移动操作(然后依然按原策略深入节点内部差异对比更新),而不会执行原策略删除节点,创建新节点操作。...比如当前遍历所有节点类型都相同,其内部文本不同,在用index作key情况下,当我们对原始数据list进行了某些元素顺序改变操作,导致了新旧集合在进行diff比较时,相同index所对应新旧节点其文本不一致了...如果存在新旧集合,相同key所对应节点类型不同(比如从span变成div),这相当于完全替换了节点,删除了节点,创建了新节点。 如果新集合,出现了集合没有存在过key。...例如某个节点key之前为1,现在为100,但集合其他节点也没有使用100这个key。说明没发生过移动操作,此时diff算法会对对应节点进行销毁并重新创建。

95320

React面试:谈谈虚拟DOM,Diff算法与Key机制5

然后给每个节点生成一个唯一标志:图片 在遍历过程,每遍历到一个节点,就将新旧两棵树作比较,并且只对同一级别的元素进行比较:图片 也就是只比较图中用虚线连接起来部分,把前后差异记录下来。...react diff算法通过新旧节点比较后,如果发现了key相同新旧节点,就会执行移动操作(然后依然按原策略深入节点内部差异对比更新),而不会执行原策略删除节点,创建新节点操作。...React官方建议不要用遍历index作为这种场景下节点key属性。...如果存在新旧集合,相同key所对应节点类型不同(比如从span变成div),这相当于完全替换了节点,删除了节点,创建了新节点。如果新集合,出现了集合没有存在过key。...例如某个节点key之前为1,现在为100,但集合其他节点也没有使用100这个key。说明没发生过移动操作,此时diff算法会对对应节点进行销毁并重新创建。

1.3K50
您找到你想要的搜索结果了吗?
是的
没有找到

谈谈虚拟DOM,Diff算法与Key机制

然后给每个节点生成一个唯一标志:图片 在遍历过程,每遍历到一个节点,就将新旧两棵树作比较,并且只对同一级别的元素进行比较:图片 也就是只比较图中用虚线连接起来部分,把前后差异记录下来。...react diff算法通过新旧节点比较后,如果发现了key相同新旧节点,就会执行移动操作(然后依然按原策略深入节点内部差异对比更新),而不会执行原策略删除节点,创建新节点操作。...React官方建议不要用遍历index作为这种场景下节点key属性。...如果存在新旧集合,相同key所对应节点类型不同(比如从span变成div),这相当于完全替换了节点,删除了节点,创建了新节点。如果新集合,出现了集合没有存在过key。...例如某个节点key之前为1,现在为100,但集合其他节点也没有使用100这个key。说明没发生过移动操作,此时diff算法会对对应节点进行销毁并重新创建。

86620

React面试:谈谈虚拟DOM,Diff算法与Key机制

react diff算法通过新旧节点比较后,如果发现了key相同新旧节点,就会执行移动操作(然后依然按原策略深入节点内部差异对比更新),而不会执行原策略删除节点,创建新节点操作。...React官方建议不要用遍历index作为这种场景下节点key属性。...比如当前遍历所有节点类型都相同,其内部文本不同,在用index作key情况下,当我们对原始数据list进行了某些元素顺序改变操作,导致了新旧集合在进行diff比较时,相同index所对应新旧节点其文本不一致了...如果存在新旧集合,相同key所对应节点类型不同(比如从span变成div),这相当于完全替换了节点,删除了节点,创建了新节点。 如果新集合,出现了集合没有存在过key。...例如某个节点key之前为1,现在为100,但集合其他节点也没有使用100这个key。说明没发生过移动操作,此时diff算法会对对应节点进行销毁并重新创建。

1.4K30

React源码解析之FunctionComponent(下)

,会尽量减少数组遍历次数 //跳出循环条件是,在遍历新老数组过程,找到第一个不能复用节点 for (; oldFiber !...,那么就执行deleteRemainingChildren(),删除节点 (3) 如果节点都已经被复用完了,但是仍有部分新节点需要被创建的话,则循环剩余数组长度,并依次创建新节点(部分代码与上面重复...没有的话,说明不是由节点更新来,而是新插入节点,返回lastPlacedIndex 四、mapRemainingChildren 作用: 将节点用 Map 结构集合起来,方便 newFiber...key的话,则说明是文本节点,则以index-value形式存储,最终返回这个 Map 对象 五、updateFromMap 作用: 在 Map 对象查找有没有 key/index 相同 fiber...//如果是文本节点的话,会从 Map 对象寻找是否有相同 index(为什么不是key?

61020

React源码分析4-深度理解diff算法_2023-02-20

上一章 react render 阶段,其中 begin 时会调用 reconcileChildren 函数, reconcileChildren 事情就是 react 知名 diff 过程...、newChild、lanes 四个参数,其中,根据 newChid 类型,我们主要关注几个比较常见类型 diff,单 React 元素 diff、纯文本类型 diff 和 数组类型 diff...diff 比较简单,只需要判断当前父 fiber 第一个子 fiber 类型: 当前 fiber 也为文本类型节点时,deleteRemainingChildren 对第一个子 fiber 所有兄弟...指向父 fiber 所以对文本类型 diff 流程如下: 图片 新内容为数组类型 上面所说两种情况,都是一个或多个子 fiebr 变成单个 fiber。...return resultingFirstChild; } 从上述代码我们可以得知,对于新增内容为数组时,react 会对 fiber 和 newChildren 进行遍历。

65330

React源码分析4-深度理解diff算法

上一章 react render 阶段,其中 begin 时会调用 reconcileChildren 函数, reconcileChildren 事情就是 react 知名 diff 过程...、newChild、lanes 四个参数,其中,根据 newChid 类型,我们主要关注几个比较常见类型 diff,单 React 元素 diff、纯文本类型 diff 和 数组类型 diff...diff 比较简单,只需要判断当前父 fiber 第一个子 fiber 类型:当前 fiber 也为文本类型节点时,deleteRemainingChildren 对第一个子 fiber 所有兄弟...指向父 fiber所以对文本类型 diff 流程如下: 图片新内容为数组类型上面所说两种情况,都是一个或多个子 fiebr 变成单个 fiber。...return resultingFirstChild;}从上述代码我们可以得知,对于新增内容为数组时,react 会对 fiber 和 newChildren 进行遍历。

32620

React源码分析4-深度理解diff算法

上一章 react render 阶段,其中 begin 时会调用 reconcileChildren 函数, reconcileChildren 事情就是 react 知名 diff 过程...、newChild、lanes 四个参数,其中,根据 newChid 类型,我们主要关注几个比较常见类型 diff,单 React 元素 diff、纯文本类型 diff 和 数组类型 diff...diff 比较简单,只需要判断当前父 fiber 第一个子 fiber 类型:当前 fiber 也为文本类型节点时,deleteRemainingChildren 对第一个子 fiber 所有兄弟...指向父 fiber所以对文本类型 diff 流程如下: 图片新内容为数组类型上面所说两种情况,都是一个或多个子 fiebr 变成单个 fiber。...return resultingFirstChild;}从上述代码我们可以得知,对于新增内容为数组时,react 会对 fiber 和 newChildren 进行遍历。

45030

React源码分析4-深度理解diff算法

上一章 react render 阶段,其中 begin 时会调用 reconcileChildren 函数, reconcileChildren 事情就是 react 知名 diff 过程...、newChild、lanes 四个参数,其中,根据 newChid 类型,我们主要关注几个比较常见类型 diff,单 React 元素 diff、纯文本类型 diff 和 数组类型 diff...diff 比较简单,只需要判断当前父 fiber 第一个子 fiber 类型:当前 fiber 也为文本类型节点时,deleteRemainingChildren 对第一个子 fiber 所有兄弟...指向父 fiber所以对文本类型 diff 流程如下: 图片新内容为数组类型上面所说两种情况,都是一个或多个子 fiebr 变成单个 fiber。...return resultingFirstChild;}从上述代码我们可以得知,对于新增内容为数组时,react 会对 fiber 和 newChildren 进行遍历。

41520

React源码之深度理解diff算法

上一章 react render 阶段,其中 begin 时会调用 reconcileChildren 函数, reconcileChildren 事情就是 react 知名 diff 过程...、newChild、lanes 四个参数,其中,根据 newChid 类型,我们主要关注几个比较常见类型 diff,单 React 元素 diff、纯文本类型 diff 和 数组类型 diff...diff 比较简单,只需要判断当前父 fiber 第一个子 fiber 类型:当前 fiber 也为文本类型节点时,deleteRemainingChildren 对第一个子 fiber 所有兄弟...指向父 fiber所以对文本类型 diff 流程如下: 图片新内容为数组类型上面所说两种情况,都是一个或多个子 fiebr 变成单个 fiber。...return resultingFirstChild;}从上述代码我们可以得知,对于新增内容为数组时,react 会对 fiber 和 newChildren 进行遍历。

37430

React源码分析4-深度理解diff算法5

上一章 react render 阶段,其中 begin 时会调用 reconcileChildren 函数, reconcileChildren 事情就是 react 知名 diff 过程...、newChild、lanes 四个参数,其中,根据 newChid 类型,我们主要关注几个比较常见类型 diff,单 React 元素 diff、纯文本类型 diff 和 数组类型 diff...diff 比较简单,只需要判断当前父 fiber 第一个子 fiber 类型:当前 fiber 也为文本类型节点时,deleteRemainingChildren 对第一个子 fiber 所有兄弟...指向父 fiber所以对文本类型 diff 流程如下: 图片新内容为数组类型上面所说两种情况,都是一个或多个子 fiebr 变成单个 fiber。...return resultingFirstChild;}从上述代码我们可以得知,对于新增内容为数组时,react 会对 fiber 和 newChildren 进行遍历。

36320

reconcileChildren解读

当修改内容为REACT_LAZY_TYPE类型,递归调用reconcileChildFibers函数。当修改内容问纯文本类型,调用reconcileSingleTextNode函数。...当修改内容为数组类型,调用reconcileChildrenArray函数。...当修改内容为可迭代类型,调用reconcileChildrenIterator函数reconcileSingleElementreconcileSingleElement源码如下: function...fiber与新生成ReactElementkey和type进行比较:如果fiber子节点与新子节点key和type不一致,给当前fiber子节点添加上Deletion标记,继续遍历其兄弟节点...如果fiber子节点与新子节点类型匹配不上,则会直接给fiber子节点打上Deletion标记,移除子节点以及后面的所有兄弟节点。

23730

reactkey作用是什么

react采用是diff算法来对比新旧虚拟节点,从而更新节点。...在交叉对比,当新节点跟节点头尾交叉对比没有结果时,会根据新节点key去对比节点数组key,从而找到相应节点(这里对应是一个key => index map映射)。...其实如果说只是文本内容改变了,不写key反而性能和效率更高,主要是因为不写key是将所有的文本内容替换一下,节点不会发生变化,而写key则涉及到了节点增和删,发现key不存在了,则将其删除,新key...所以说key是给每一个vnode唯一id,可以依靠key,更准确, 更快拿到oldVnode对应vnode节点,高效和准确更新节点 误区 很多人在写key是通常是将循环index写入,这样又写了...因为在react如果你没有指定任何 key,react 会发出警告,并且会把数组索引当作默认 key。但是如果想要对列表进行重新排序、新增、删除操作时,把数组索引作为 key 是有问题

1.8K30

有哪些前端面试题是面试官必考_2023-03-01

Iterator迭代器 Iterator(迭代器)是一种接口,也可以说是一种规范。为各种不同数据结构提供统一访问机制。...let arr = [{num:1},2,3] let it = arr[Symbol.iterator]() // 获取数组迭代器 console.log(it.next()) // { value...图片 这就意味着,如果 dom 节点发生了跨层级移动,react 会删除节点,生成新节点,而不会复用。...,两者区别如下: forEach()方法会针对每一个元素执行提供函数,对数据操作会改变原数组,该方法没有返回; map()方法不会改变原数组,返回一个新数组,新数组为原数组调用函数处理之后...明文传输: 协议报文使用文本形式,这就直接暴露给外界,不安全。

1.5K00

是时候该知道ReactKey属性作用与最佳实践了!

React渲染组件时,会创建一个虚拟DOM树,并与之前虚拟DOM树进行比较,找出差异,并将差异应用到真实DOM上。...在这个比较过程React需要对每个元素进行唯一性判断,以确定是否需要更新该元素。而这个唯一性判断就依赖于key属性。React使用key属性来判断元素是否相同。...使用了一个简单数组作为组件state,每个数组元素包含一个id和text属性。...在渲染列表项时,我们使用了每个元素id作为key属性。 当用户点击“Update”按钮时,我们改变了数组第二个元素文本内容,并重新设置state。...由于该元素id没有改变,React会认为它是同一个元素,并且只会更新它文本内容,而不是重新渲染整个列表。这样就可以大大提高渲染性能,避免不必要重绘操作。

49910

虚拟 DOM 到底是什么?(长文建议收藏)

从 h 函数说起 观察主流虚拟 DOM 库(snabbdom、virtual-dom),通常都有一个 h 函数,也就是 React React.createElement,以及 Vue render...,且新旧节点 tag 相同 对比新旧节点属性 对比新旧节点子节点差异,通过 key 进行重排序,key 相同节点继续向下遍历 新旧节点如果都是 VText,判断两者文本是否发生变化 其他情况直接用新节点替代节点...找到数组首部和尾部公共节点,并在两端移动 该方法通过比对两端 key ,找到节点(A) 和新节点(B)索引相同节点。...稍后,我们将把子节点中节点位置分配给这个数组。.... == -1 然后,我们构建一个对象 I,它键表示新子节点 key 为子节点在剩余节点数组位置。

2.1K31

ES7、ES8新特性

它是一个替代indexOf,开发人员用来检查数组是否存在,indexOf是一种尴尬使用,因为它返回一个元素在数组位置或者-1当这样元素不能被找到情况下。...在ES6,要检查是否存在,你需要做一些判断,因为他们没有匹配到,Array.prototype.indexOf返回-1变成了true(转换成true),但是当匹配元素为0位置时候,该数组包含元素,...Object.values/Object.entries 在ES8 /ES2017之前,Javascript开发者需要迭代一个对象自身属性时候不得不用Object.keys,通过迭代且使用obj[key...]获取value返回一个数组。...共享内存与原子操作 当内存被共享时,多个线程可以并发读、写内存相同数据。原子操作可以确保那些被读、写都是可预期,即新事务是在事务结束之后启动事务在结束之前并不会被中断。

3.5K50

ES7和ES8新特性介绍

它是一个替代indexOf,开发人员用来检查数组是否存在,indexOf是一种尴尬使用,因为它返回一个元素在数组位置或者-1当这样元素不能被找到情况下。...在ES6,要检查是否存在,你需要做一些判断,因为他们没有匹配到,Array.prototype.indexOf返回-1变成了true(转换成true),但是当匹配元素为0位置时候,该数组包含元素,...Object.values/Object.entries 在ES8 /ES2017之前,Javascript开发者需要迭代一个对象自身属性时候不得不用Object.keys,通过迭代且使用obj[key...]获取value返回一个数组。...共享内存与原子操作 当内存被共享时,多个线程可以并发读、写内存相同数据。原子操作可以确保那些被读、写都是可预期,即新事务是在事务结束之后启动事务在结束之前并不会被中断。

5.4K60
领券