tree.tsx 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. import { Input, Tree } from 'antd';
  2. import { SearchOutlined } from '@ant-design/icons';
  3. import DragItem from '@/pages/system/Menu/Setting/dragItem';
  4. import { Droppable } from 'react-beautiful-dnd';
  5. interface TreeBodyProps {
  6. treeData: any[];
  7. droppableId: string;
  8. }
  9. const { TreeNode } = Tree;
  10. export default (props: TreeBodyProps) => {
  11. const createTreeNode = (data: any[], type: string): React.ReactNode => {
  12. return data.map((item: any) => {
  13. if (item.children) {
  14. return (
  15. <TreeNode title={<DragItem data={item} type={type} />}>
  16. {createTreeNode(item.children, type)}
  17. </TreeNode>
  18. );
  19. }
  20. return <TreeNode title={<DragItem data={item} type={type} />}></TreeNode>;
  21. });
  22. };
  23. return (
  24. <div className={'tree-content'}>
  25. <div style={{ width: '75%' }}>
  26. <Input
  27. prefix={<SearchOutlined style={{ color: '#B3B3B3' }} />}
  28. placeholder={'请输入菜单名称'}
  29. />
  30. </div>
  31. <div className={'tree-body'}>
  32. <Droppable
  33. droppableId={props.droppableId}
  34. direction="horizontal"
  35. type="COLUMN"
  36. isCombineEnabled={true}
  37. >
  38. {(provided) => (
  39. <div
  40. className="columns"
  41. {...provided.droppableProps}
  42. ref={provided.innerRef}
  43. style={{ height: '100%' }}
  44. >
  45. <Tree draggable={props.droppableId === 'menu'}>
  46. {createTreeNode(props.treeData, props.droppableId)}
  47. </Tree>
  48. </div>
  49. )}
  50. </Droppable>
  51. </div>
  52. </div>
  53. );
  54. };