Reactjs 使用重新安装的键对列表项作出反应

Reactjs 使用重新安装的键对列表项作出反应,reactjs,react-window,Reactjs,React Window,我有一个React项目,有一些相当大的列表。它已经到了对性能产生不利影响的地步,我决定使用虚拟化技术对它们进行虚拟化。转换很简单,但我遇到了一个问题:对列表项的任何更改(列表大小、项属性更改、任何更改…)都会导致所有列表项重新装载(而不仅仅是重新渲染) 我还没来得及将其分解成一个可复制的案例,因为应用程序非常庞大,但我做了以下观察: 所有列表项都有一个键,这可以通过React Developer工具进行验证 当列表中的项目发生更改时,所有键保持完全相同 当使用普通的映射呈现列表项时,它们不会在

我有一个React项目,有一些相当大的列表。它已经到了对性能产生不利影响的地步,我决定使用虚拟化技术对它们进行虚拟化。转换很简单,但我遇到了一个问题:对列表项的任何更改(列表大小、项属性更改、任何更改…)都会导致所有列表项重新装载(而不仅仅是重新渲染)

我还没来得及将其分解成一个可复制的案例,因为应用程序非常庞大,但我做了以下观察:

  • 所有列表项都有一个
    ,这可以通过React Developer工具进行验证
  • 当列表中的项目发生更改时,所有
    键保持完全相同
  • 当使用普通的
    映射
    呈现列表项时,它们不会在任何更改后重新装载
  • 当对相同的列表项使用
    react窗口
    时,它们在任何更改时都会重新装载
  • 父列表组件不会在更改时重新装载(仅重新呈现)
这让我相信是react窗口导致了重新安装,但所有在线示例都没有显示这种行为。在报告的问题中,如果确实出现这种情况,通常会得出结论,即开发人员没有为其项目提供
,或者错误地使用

当被问到这样的问题时,人们通常倾向于回答他们需要停止使用匿名函数作为项目的答案,使用React.memo、实现componentdiddupdate等。。。但这不是我要处理的问题。我已经控制了组件的重新渲染。事实上,这些项目都在重新安装,即使它们都有钥匙并且钥匙没有变化


由于我没有代码片段可供提供,我的主要问题是:什么情况可能导致React重新装载始终保留相同密钥的列表项?

没有代码片段很难说。但有一种情况可能是,该组件的根包含带有键的列表,完全改变了类型,然后diff算法认为这是一个全新的元素,并通过new呈现所有节点,它看起来像一个
反应窗口
bug。另一种可能是由于某种原因,您的邮件列表组件正在重新装载。我建议,使用您自己的解决方案,分解列表组件以实现最大性能