【问题标题】:Unable to integrate FixedSizeList (react-window) component with antd transfer component无法将 FixedSizeList (react-window) 组件与 antd 传输组件集成
【发布时间】:2021-04-15 14:37:20
【问题描述】:

antd 是很棒的组件库,但是在将 react-window 与 Transfer 组件集成时我面临一些挑战。

我试图在 Transfer 组件中渲染一个巨大的列表,由于 antd 3.x Transfer 组件随着项目长度的增加而滞后,所以我想到了将 react-window 组件与 Transfer 组件一起使用。

在链接中:-https://stackblitz.com/edit/react-ofcadv-gcds33?file=index.js

我正在尝试将 react-window 与传输组件集成,但无法设置 antd 传输组件中可用的一些默认行为。 要查看 antd 组件的默认行为,我们可以通过在代码库中将 perfMode 设置为 false 来检查。

当使用 FixedSizeList 组件和 Transfer 组件时,selectAll 等一些基本功能不起作用。

感谢任何可以为我指明正确方向的帮助。

重现步骤:-

  1. 访问https://stackblitz.com/edit/react-ofcadv-gcds33?file=index.js
  2. 要启用虚拟化,请转到 index.js 的第 126 行并将 perfMode 设置为 true。
  3. 选择一些元素并点击右箭头。
  4. 选定的元素移动到正确的存储桶,但不会取消选中。

【问题讨论】:

    标签: javascript reactjs antd react-window


    【解决方案1】:

    您似乎缺少传递 selectedKeys。

    看看下面完全可行的解决方案:

    const { Transfer } = antd;
    const ReactDragListView = window["react-drag-listview"];
    
    const dataSource = [];
    for (let i = 0; i < 20; i++) {
      dataSource.push({
        key: i.toString(),
        title: `Item ${i + 1}`
      });
    }
    
    const targetKeys = dataSource
      .filter(item => +item.key % 3 > 1)
      .map(item => item.key);
    
    class TransferDemo extends React.Component {
      state = {
        targetKeys,
        selectedKeys: []
      };
    
      handleChange = nextTargetKeys => {
        this.setState({ targetKeys: nextTargetKeys });
      };
    
      handleSelectChange = (sourceSelectedKeys, targetSelectedKeys) => {
        this.setState({
          selectedKeys: [...sourceSelectedKeys, ...targetSelectedKeys]
        });
      };
    
      getDragProps = () => ({
        onDragEnd: (fromIndex, toIndex) => {
          const targetKeys = [...this.state.targetKeys];
          const item = targetKeys.splice(fromIndex, 1)[0];
          targetKeys.splice(toIndex, 0, item);
    
          this.handleChange(targetKeys);
        },
        nodeSelector: ".ant-transfer-list:last-child .ant-transfer-list-content > div"
      });
    
      render() {
        const { targetKeys, selectedKeys } = this.state;
    
        return (
          <div>
            <ReactDragListView {...this.getDragProps()}>
              <Transfer
                dataSource={dataSource}
                titles={["Source", "Target"]}
                targetKeys={targetKeys}
                selectedKeys={selectedKeys}
                onChange={this.handleChange}
                onSelectChange={this.handleSelectChange}
                render={item => item.title}
                listStyle={{ height: 300 }}
              />
            </ReactDragListView>
          </div>
        );
      }
    }
    
    ReactDOM.render(
      <TransferDemo />,
      document.getElementById('root')
    );
    

    也为您推荐link

    祝你好运!

    【讨论】:

    • 谢谢@James。笔看起来很干净。是否可以添加 react-window 以便它可以处理大量数据集,例如源部分中的 30k 项。
    • 是的,当然。其实是用react写的。至于庞大的数据集,我不知道,因为它是由 antd 提供的。以防万一,可能会有沉重的负担。如果它适用于您的情况,请接受我的回答,那就太好了。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-29
    • 1970-01-01
    • 2020-11-29
    • 2020-12-21
    相关资源
    最近更新 更多