这是我的反应组件的cellSizeAndPositionGetter
和render
功能。当我调整屏幕大小时,我的屏幕布局没有改变,但我可以通过控制台确认width
and state.columnCount
(由 使用cellSizeAndPositionGetter
)正在改变。
是否可以在参数更改后触发Collection
更新(即width
)? 还是我在这里做错了什么?
旁注: 宽度参数更改时react-virtualized
List
会更新。
cellSizeAndPositionGetter({index}) {
const list = this.state.cardsList;
const columnCount = this.state.columnCount;
const columnPosition = index % (columnCount || 1);
const datum = list[index];
const height = datum.height;
const width = CELL_WIDTH;
const x = columnPosition * (GUTTER_SIZE + width);
const y = this._columnYMap[columnPosition] || 0;
this._columnYMap[columnPosition] = y + height + GUTTER_SIZE;
return ({
height,
width,
x,
y
});
}
...
render() {
return (
<div style={styles.subMain}>
<AutoSizer >
{({height, width}) => {
console.log(`width: ${width}`);
console.log(`col count: ${this.state.columnCount}`);
return (
<Collection
cellCount={this.state.cardsList.length}
cellRenderer={this.cellRenderer}
cellSizeAndPositionGetter={this.cellSizeAndPositionGetter}
height={height}
width={width}
overscanRowCount={1}
/>
);
}}
</AutoSizer>
</div>
);
}
更新:(几个小时后)
我发现了一个非常笨拙的解决方法,可以react-virtualize
Collection
在宽度参数更改后进行更新。
当屏幕尺寸发生变化时,我会删除Collection
显示元素(图像)列表中的最后一个元素。起初我尝试清除列表,但这会导致明显的视觉副作用。现在,在调整屏幕大小时,只有我显示器中的最终图像会奇怪地闪烁。
Collection
但是在更改后进行更新仍然会很好width
。:)
这是似乎欺骗Collection
更新的代码。关键部分是setState
我删除最后一个元素的第三行。
updateDimensions() {
this.setState({
screenWidth: window.innerWidth,
columnCount: Math.floor(window.innerWidth / (CELL_WIDTH + GUTTER_SIZE)),
cardsList: [...this.state.cardsList.slice(0, this.state.cardsList.length - 1)]
});
}
componentDidMount() {
...
window.addEventListener("resize", this.updateDimensions);
}