在我滚动之前,react-virtualized 列表项不会使用更改的道具重新渲染
Posted
技术标签:
【中文标题】在我滚动之前,react-virtualized 列表项不会使用更改的道具重新渲染【英文标题】:react-virtualized list item does not re-render with changed props until I scroll 【发布时间】:2019-03-17 02:36:24 【问题描述】:我有一个这样的反应虚拟化列表(使用列表组件):
renderItem = ( index, key, style ) =>
const
entries,
projectId,
= this.props;
const entry = entries[index];
return (
<div key=key style=style>
<MyItem
entry=entry
entryIndex=index
projectId=projectId
/>
</div>
);
<List
rowHeight=75
rowRenderer=this.renderItem
rowCount=entries.length
width=780
height=1000
/>
MyItem
连接到一个 redux store 并且可以与之交互。但是,在我滚动列表之前,它不会反映屏幕上的任何更改,只要我滚动,我就会看到列表项,因为它应该是更新后的 MyItem's
render()
终于被调用了。
如何在 prop 更改时进行 react-virtualized 以重新渲染列表项?
【问题讨论】:
【参考方案1】:我找到了另一种适合我的解决方案。 我创建了一个包含数据长度的不可见元素。
<div>
<span style= display: 'none' >yourData.length</span>
<List ... />
</div>
我正在寻找一种解决方案,以便在有人写消息时更新我的聊天记录 (socket.io)。这对我来说是最好的解决方案,因为 forceUpdate
不起作用,另外一个 prop
会渲染所有元素,这会为我的代码中的每个聊天气泡触发动画。
【讨论】:
【参考方案2】:我很确定您可以简单地将相关道具传递到您的列表中。它看起来像这样。
<List
rowHeight=75
rowRenderer=this.renderItem
rowCount=entries.length
width=780
height=1000
data=entries // this prop can be called anything
/>
当然,List 实际上并没有名为 data
的 prop,但是将数据集作为 prop 传递会告诉 List 在数据更改时重新渲染。
在底层,List 和其他组件使用 PureComponent,只要你传递给它们的道具发生变化,它就会触发重新渲染。你可以阅读更多关于here的内容。
注意:我实际上从未对列表组件进行过此操作,但已将其与 MultiGrid 组件一起使用。在我的用例中,我允许用户对数据进行排序,并且需要将数据集传递给 MultiGrid,以便在数据更改时重新呈现。
希望这会有所帮助。
【讨论】:
我在react-virtualized的文档中没有找到这个解决方案,但是可以。谢谢! 是的,这行得通! .. 你只需要传递一个额外的属性,它下次是唯一的,以便 List 组件在 shallowCompare 中找到新的变化并调用给定的重新渲染方法。 data=Math.random() 是通用解决方案。以上是关于在我滚动之前,react-virtualized 列表项不会使用更改的道具重新渲染的主要内容,如果未能解决你的问题,请参考以下文章
如何滚动到通过 react-virtualized 呈现的 React 元素?
react-virtualized WindowScroller 性能问题
有没有办法通过 react-virtualized 将 ref 设置为 List ?