简体   繁体   English

React 虚拟化自动滚动问题

[英]React Virtualized Auto Scroll Issue

I am using react-virtualized v-9.21.2 to display a list, I am having an issue on insertion of a new item, upon inserting a new item to the list I am clearing the cache and updating the listkey to auto resize the height, otherwise, the new added item will be cropped but when the listkey get updated the list automatically scroll to top and this is not a desired behavior, my code is as follow:我正在使用 react-virtualized v-9.21.2 显示列表,我在插入新项目时遇到问题,在将新项目插入列表时我正在清除缓存并更新 listkey 以自动调整高度,否则,新添加的项目将被裁剪,但是当 listkey 更新时,列表会自动滚动到顶部,这不是所需的行为,我的代码如下:

 UNSAFE_componentWillReceiveProps(nextprops) {
    if (this.props.items.length !== nexprops.items.lenght)) {
    // clear the cache and update the listKey
    this.cache.clearAll();
    this.virtualizedList && this.virtualizedList.recomputeRowHeights();
    this.listKey += 1
 }


renderItem = ({ index, key, parent, style }) => {
        return (
            <CellMeasurer
                cache={this.cache}
                columnIndex={0}
                key={`CellMeasurerRow_${key}`}
                parent={parent}
                rowIndex={index} >
                <div
                    key={`Item__${key}`}
                    style={style}
                    className='row'>
                    <Item
                        style={style}
                        key={`Item_${index}`}
                    />
                </div>
            </CellMeasurer>
        )
    }



render(){
    return (
        <WindowScroller
            key={`Scroller_${this.listKey}`}
            ref={(e) => this.windowRef = e} >
            {({ height, isScrolling, onChildScroll, registerChild, scrollTop, }) => (
                <AutoSizer>
                    {({ width }) => (
                        <React.Fragment key={registerChild}>
                            <List
                                ref={`ListKey_${this.listKey}`}
                                autoHeight
                                isScrolling={isScrolling}
                                onScroll={onChildScroll}
                                key={this.listKey}
                                scrollTop={scrollTop}
                                height={height}
                                rowCount={this.props.items.length}
                                rowRenderer={this.renderItem}
                                deferredMeasurementCache={this.cache}
                                rowHeight={this.cache.rowHeight}
                                width={width}
                                overscanRowCount={10} />
                     

                        </React.Fragment>
                    )}
                </AutoSizer>
            )}
        </WindowScroller>
    )
}

I tried programmatically to scroll to adjust the height without the update of the key, it worked but still not accurate, So, How can I update the virtualized with a new item and adjust the height without scrolling??我尝试以编程方式滚动以调整高度而不更新键,它工作但仍然不准确,那么,如何使用新项目更新虚拟化并调整高度而不滚动?

If your data has a unique key, I think you can create a ListItem component add an useEffect hook calling the measure function when the data change.如果您的数据具有唯一键,我认为您可以创建一个ListItem组件添加一个useEffect挂钩,在数据更改时调用measure function。 This may have performance impact.这可能会对性能产生影响。

function ListItem(props) {
  useEffect(props.measure, [props.data.id]);
  return (
    <div style={props.style}>
      {/* content render */}
    </div>
  );
}
renderItem = ({ index, key, parent, style }) => {
        const item = getItem(index); // suppose item data structure: { id: unique_key }
        return (
            <CellMeasurer
                cache={this.cache}
                columnIndex={0}
                key={`CellMeasurerRow_${key}`}
                parent={parent}
                rowIndex={index} 
            >
               {(measure) => (
                  <ListItem 
                    key={`Item__${key}`} style={style} 
                    data={item}
                    measure={measure}
                  />
               )}
            </CellMeasurer>
        )
    }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM