demo.jsx 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. import React from 'react';
  2. import ReactDOM from 'react-dom';
  3. import 'antd/dist/antd.css';
  4. import './index.css';
  5. import { Transfer, Tree } from 'antd';
  6. const { TreeNode } = Tree;
  7. // Customize Table Transfer
  8. const isChecked = (selectedKeys, eventKey) => {
  9. return selectedKeys.indexOf(eventKey) !== -1;
  10. };
  11. const generateTree = (treeNodes = [], checkedKeys = []) => {
  12. return treeNodes.map(({ children, ...props }) => (
  13. <TreeNode {...props} disabled={checkedKeys.includes(props.key)} key={props.key}>
  14. {generateTree(children, checkedKeys)}
  15. </TreeNode>
  16. ));
  17. };
  18. const TreeTransfer = ({ dataSource, targetKeys, ...restProps }) => {
  19. const transferDataSource = [];
  20. function flatten(list = []) {
  21. list.forEach(item => {
  22. transferDataSource.push(item);
  23. flatten(item.children);
  24. });
  25. }
  26. flatten(dataSource);
  27. return (
  28. <Transfer
  29. {...restProps}
  30. targetKeys={targetKeys}
  31. dataSource={transferDataSource}
  32. className="tree-transfer"
  33. render={item => item.title}
  34. showSelectAll={false}
  35. >
  36. {({ direction, onItemSelect, selectedKeys }) => {
  37. if (direction === 'left') {
  38. const checkedKeys = [...selectedKeys, ...targetKeys];
  39. return (
  40. <Tree
  41. blockNode
  42. checkable
  43. checkStrictly
  44. defaultExpandAll
  45. checkedKeys={checkedKeys}
  46. onCheck={(
  47. _,
  48. {
  49. node: {
  50. props: { eventKey },
  51. },
  52. },
  53. ) => {
  54. onItemSelect(eventKey, !isChecked(checkedKeys, eventKey));
  55. }}
  56. onSelect={(s,
  57. _,
  58. {
  59. node: {
  60. props: { eventKey },
  61. },
  62. },
  63. ) => {
  64. onItemSelect(eventKey, !isChecked(checkedKeys, eventKey));
  65. }}
  66. >
  67. {generateTree(dataSource, targetKeys)}
  68. </Tree>
  69. );
  70. }
  71. }}
  72. </Transfer>
  73. );
  74. };
  75. const treeData = [
  76. { key: '0-0', title: '0-0' },
  77. {
  78. key: '0-1',
  79. title: '0-1',
  80. children: [{ key: '0-1-0', title: '0-1-0' }, { key: '0-1-1', title: '0-1-1' }],
  81. },
  82. { key: '0-2', title: '0-3' },
  83. ];
  84. class App extends React.Component {
  85. state = {
  86. targetKeys: [],
  87. };
  88. onChange = targetKeys => {
  89. console.log('Target Keys:', targetKeys);
  90. this.setState({ targetKeys });
  91. };
  92. render() {
  93. const { targetKeys } = this.state;
  94. return (
  95. <div>
  96. <TreeTransfer dataSource={treeData} targetKeys={targetKeys} onChange={this.onChange} />
  97. </div>
  98. );
  99. }
  100. }
  101. ReactDOM.render(<App />, document.getElementById('container'));