--- order: 6 title: zh-CN: 树穿梭框 en-US: Tree Transfer --- ## zh-CN 使用 Tree 组件作为自定义渲染列表。 ## en-US Customize render list with Tree component. ```jsx import { Transfer, Tree } from 'antd'; // Customize Table Transfer const isChecked = (selectedKeys, eventKey) => { return selectedKeys.indexOf(eventKey) !== -1; }; const generateTree = (treeNodes = [], checkedKeys = []) => { return treeNodes.map(({ children, ...props }) => ({ ...props, disabled: checkedKeys.includes(props.key), children: generateTree(children, checkedKeys), })); }; const TreeTransfer = ({ dataSource, targetKeys, ...restProps }) => { const transferDataSource = []; function flatten(list = []) { list.forEach(item => { transferDataSource.push(item); flatten(item.children); }); } flatten(dataSource); return ( item.title} showSelectAll={false} > {({ direction, onItemSelect, selectedKeys }) => { if (direction === 'left') { const checkedKeys = [...selectedKeys, ...targetKeys]; return ( { onItemSelect(key, !isChecked(checkedKeys, key)); }} onSelect={(_, { node: { key } }) => { onItemSelect(key, !isChecked(checkedKeys, key)); }} /> ); } }} ); }; const treeData = [ { key: '0-0', title: '0-0' }, { key: '0-1', title: '0-1', children: [ { key: '0-1-0', title: '0-1-0' }, { key: '0-1-1', title: '0-1-1' }, ], }, { key: '0-2', title: '0-3' }, ]; class App extends React.Component { state = { targetKeys: [], }; onChange = targetKeys => { console.log('Target Keys:', targetKeys); this.setState({ targetKeys }); }; render() { const { targetKeys } = this.state; return (
); } } ReactDOM.render(, mountNode); ```