我正在尝试在React-virtualized中绑定(bind)AutoSizer和Masonry组件。我的项目列表处于状态,并且异步出现在componentDidMount()中。如果我使用简单的匿名箭头功能来渲染石工,一切正常。但是,如果我使用诸如“renderMasonry”之类的单独函数,则会得到空结果,直到调整窗口大小并触发重新渲染为止。我不明白为什么在这种情况下AutoSizer不会重新呈现。 Plunkr is here https://plnkr.co/edit/fmAqp1MOzlKGP96LeDjP
最佳答案
这是关键。每次都会重新创建一个匿名函数,因此AutoSizer
的shouldComponentUpdate
看到一个新值,并返回true而不是false。 (在react-virtualized文档的顶部附近,有一个与此相关的section titled "Pure Components"。)
在这种情况下,唯一传递给AutoSizer
的2个属性是disableHeight
和children
。如果这些渲染之间都没有改变,则AutoSizer
本身将假定跳过重新渲染是安全的。
事后看来,我不确定让AutoSizer
扩展PureComponent
是一个好主意,因为重新渲染它的代价很小,而且可能造成困惑。话虽如此,人们通常将内联函数用作反应虚拟化组件的子代,这避免了如上所述的问题。