简体   繁体   English

无法将 FixedSizeList (react-window) 组件与 antd 传输组件集成

[英]Unable to integrate FixedSizeList (react-window) component with antd transfer component

antd is great component library, however I am facing some challenges while integrating the react-window with Transfer component. antd 是很棒的组件库,但是在将 react-window 与 Transfer 组件集成时我面临一些挑战。

I am trying to render a huge list in the Transfer component and since the antd 3.x Transfer component lags as the items length increases so I thought of using the react-window component with the Transfer component.我正在尝试在 Transfer 组件中呈现一个巨大的列表,并且由于 antd 3.x Transfer 组件随着项目长度的增加而滞后,所以我想到了将 react-window 组件与 Transfer 组件一起使用。

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

I am trying to integrate the react-window with the transfer component but unable to set up some of default behavior available in the antd transfer component.我正在尝试将 react-window 与传输组件集成,但无法设置 antd 传输组件中可用的一些默认行为。 To view the default behavior of the antd component we can check by setting perfMode to false in the code base.要查看 antd 组件的默认行为,我们可以通过在代码库中将 perfMode 设置为 false 来检查。

Some of the basic things like selectAll etc. doesn't work when using FixedSizeList component with the Transfer component.将 FixedSizeList 组件与 Transfer 组件一起使用时,某些基本功能(例如 selectAll 等)不起作用。

Any help which will point me in the right direction is appreciated.任何可以为我指明正确方向的帮助表示赞赏。

Steps to reproduce:-重现步骤:-

  1. Visit https://stackblitz.com/edit/react-ofcadv-gcds33?file=index.js访问https://stackblitz.com/edit/react-ofcadv-gcds33?file=index.js
  2. To enable virtualization goto line number 126 of index.js and set perfMode to true.要启用虚拟化,请转到 index.js 的第 126 行并将 perfMode 设置为 true。
  3. Select some elements and click on the right arrow. Select 一些元素并单击右箭头。
  4. selected elements shifts to the right bucket but doesn't get unchecked.选定的元素移动到正确的存储桶,但不会被取消选中。

it seems like you are missing to pass selectedKeys.似乎您缺少传递 selectedKeys。

Have a look at completely working solution below:看看下面完全可行的解决方案:

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')
);

Referring a link as well for you.也为您推荐一个链接

Good luck!祝你好运!

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

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