【问题标题】:React-virtualized List selected item styling only fire when scroll upReact-virtualized List selected item 样式仅在向上滚动时触发
【发布时间】:2019-10-01 01:26:57
【问题描述】:

我正在使用 React-virtualized 将数据显示为列表。 我为列表项添加了选定的样式,它假设一旦被点击就会突出显示该项目。 当前的问题是onClick 被触发,但选择样式仅在向上滚动列表时显示。

List component

 <div className={styles.autoSizerContainer}>
                <AutoSizer>
                    {({width, height}) => {
                        // Selected customer styling only fire after scroll
                        return (
                            <List
                                width={width}
                                height={height}
                                rowHeight={50}  
                                rowRenderer={this.renderRow}
                                rowCount={rowCount}
                                overscanRowCount={3}    
                                className={styles.list}
                            />
                        )
                    }}
                </AutoSizer>
            </div>

List item

private renderRow = ({index, key, style}: ListRowProps) => {
        const data = this.props.dataList[index];
        return (
            <div style={style} key={data.id}>
                <div className={styles.listItem}>
                    <div>data.name</div>
                    <Item key={data.id} 
                         isDataSelected={this.state.selectedId === data.id}
                    /> //return true will show selected styling
                </div>
            </div>
        )
    };

"react-virtualized": "^9.21.0",

"react": "^16.8.4"

欢迎提出任何想法!

谢谢!!!

【问题讨论】:

    标签: reactjs react-virtualized


    【解决方案1】:

    React-Virtualized 只会在 ListRowProps 提供的其中一个道具发生变化时重新渲染您的组件。它不知道您的渲染方法在内部使用了this.props.dataListthis.state.selectedId。您需要做以下两件事之一。

    1. 明确告诉列表在this.state.selectedId 更改时重绘。 List 为此目的公开了一个 api。

    2. 使用类似 React 的 Context api 的方式提供必要的数据,以便可以检测到更改。像这样的东西应该可以工作:

    const {Provider, Consumer} = React.createContext<number | null>(null);
    
     <div className={styles.autoSizerContainer}>
                    <AutoSizer>
                        {({width, height}) => {
                            // Selected customer styling only fire after scroll
                            return (
                                <Provider value={this.state.selectedId}>
                                <List
                                    width={width}
                                    height={height}
                                    rowHeight={50}  
                                    rowRenderer={this.renderRow}
                                    rowCount={rowCount}
                                    overscanRowCount={3}    
                                    className={styles.list}
                                />
                                </Provider>
                            )
                        }}
                    </AutoSizer>
                </div>
    
    private renderRow = ({index, key, style}: ListRowProps) => {
            const data = this.props.dataList[index];
            return (
                <Consumer>
                {(selectedId) =>
                <div style={style} key={data.id}>
                    <div className={styles.listItem}>
                        <div>data.name</div>
                        <Item key={data.id} 
                             isDataSelected={selectedId === data.id}
                        /> //return true will show selected styling
                    </div>
                </div>
                }
                </Consumer>
            )
        };
    

    【讨论】:

    • 这很尴尬,我发现只要我把这个组件改成FunctionalComponent,它就可以正常工作,但是用类组件编写时,选择的颜色显示只会向上滚动列表......。无论如何它解决了。再次感谢
    猜你喜欢
    • 2017-04-20
    • 1970-01-01
    • 2021-02-02
    • 2018-11-02
    • 1970-01-01
    • 2018-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多