React-window: 更改一项道具会更新整个列表

创建于 2019-03-18  ·  17评论  ·  资料来源: bvaughn/react-window

嘿,

我看到了您记下的示例,并且看到如果项目的状态发生更改,整个列表也会更新。 请参阅下面的Gif。 这是您来自https://react-window.now.sh/#/examples/list/memoized -list-items的示例

2019-03-18_13-43-16

目前,我的清单存在相同的问题。 我在每个ListItem中都有一个复选框,如果用户选中了此复选框,则每个项目都将被卸载,并且显然是新安装的。 那是个大问题,因为它真的很慢。

image

希望任何人都可以帮助我:)

💬 question

最有用的评论

需要明确的是,这就是为什么所有docs示例都显示了在父组件之外定义项目渲染的原因,而备忘录示例说明了如何在两者之间共享数据。 (基本上,这就像是较轻的内置上下文。)

所有17条评论

我有完全相同的用例和问题,但无法找到解决方案...

这是因为更改项目会创建一个新的items数组,该会创建一个新的itemData对象。 重要的是,记忆技术必须先失效,然后数据才能更改。

如果您希望项目对这种更改更加健壮,则可以实现自己的areEqual函数(或shouldComponentUpdate )。

该演示的目的只是为了演示itemData和便笺如何协同工作以传递复杂的值。

我用自己的shouldComponentUpdate函数进行了测试,但是如果该组件一次又一次地被挂载,则该函数将不会执行

如果组件会一次又一次地挂载

没有办法记住要卸载的组件。 不过,这不是我的演示中发生的情况。 如果这是您的应用程序中发生的事情,则说明还有其他情况–我无法推测。

@BertelBB您找到解决方案了吗?

@ffjanhoeck不是,不是。 我意识到我的用例实际上在某种意义上有点不同,因为我的列表也可以排序/过滤。 我所做的是我通过在设置ItemData和道具的ItemKey让我手动为每一个项目的关键支柱。 整个列表仍在更新,但不像以前那么麻烦。
https://react-window.now.sh/#/api/FixedSizeList在这里您可以阅读有关我所指的道具的信息。

@BertelBB我昨天已经实现了该功能,谢谢:)
但是问题并没有解决:(
这是一个GIF,有点落后-如您所见,检查项目花费了几毫秒的时间。
一切都已被记住或已实现了shouldComponentUpdate。

2019-03-20_15-09-49

@ffjanhoeck是的,有同样的问题。 不幸的是,到目前为止,我还没有时间对此做进一步的研究。 但是如果我找到更好的解决方案,我会告诉您的:)

@ffjanhoeck我有机会看到您在上面的GIF中显示的应用程序吗? 我很好奇,想运行一个探查器,看看速度慢是从哪里来的。

@bvaughn是的-我已经在您的电子邮件中向您发送了凭据! :)

我认为缓慢是由于项目的简短预览(图片和带有辅助文本的蓝色文本代表EntityShortPreview组件)。 但这不是一个项目的问题。 问题在于所有项目都将被卸载并安装在select上,如果将其汇总,则速度很慢。

那就是我目前的感觉:D但也许您可以找到其他问题:)

如果用户选择一项,则会发生这种情况

image

@ffjanhoeck我遇到了完全相同的问题,经过一番调查,我设法找出了原因:这是因为我们将匿名函数用作项目渲染器,而不是命名组件。 我不是React专家,但我相信这会打乱React的对帐,因为渲染之间的组件并不相同。

我制作了一个CodeSandbox示例,在这里说明了问题: https ://codesandbox.io/s/qx4088mn36

我相信这也与这里的对话有关: https :

经过今天早上的快速浏览,我也看到了这一点。 (正在写一封电子邮件,但被打断了。)将内联函数移动到一个实例可以加快工作速度,(但由于repro案件的规模,我还没时间来追踪其他一些事情)。

我相信这会打乱React的对帐,因为渲染之间的成分并不相同。

这是对的。 👍

唔。 这很不幸,因为我正在使用ReasonReact编写我的项目,该项目(当前)缺少避免这种问题的必要的prop扩展/功能组件功能。 我认识到这在任何情况下都不是React窗口的问题,而只是ReasonML类型系统的局限性,但是我想值得一提的是其他任何人偶然发现此线程。

需要明确的是,这就是为什么所有docs示例都显示了在父组件之外定义项目渲染的原因,而备忘录示例说明了如何在两者之间共享数据。 (基本上,这就像是较轻的内置上下文。)

太好了,我来看看! :)

您的解决方案解决了问题! 谢谢你,祝你有美好的一天

此页面是否有帮助?
0 / 5 - 0 等级