import { TreeSelect } from "antd"; import { useEffect } from "react"; import { arrayObjectDeduplication, getDataType, getTreeNodePaths, processTreeDataByLevel, processTreeDataForOnlyLastLevel } from "../../../utils"; /** * 基础下拉树组件(不建议直接使用此组件,二次继承使用) */ function BasicSelectTree(props) { const { onGetData, onChange, onGetLabel, onGetNodePaths, onGetNodePathsIsIncludeOneself = true, placeholder = "", treeData = [], nameKey = "name", idKey = "id", childrenKey = "children", level, onlyLastLevel = false, ...restProps } = props; // 根据 level 处理树数据 let processedTreeData = level ? processTreeDataByLevel({ data: treeData, level, childrenKey, currentLevel: 1, }) : treeData; // 根据 onlyLastLevel 处理树数据 processedTreeData = processTreeDataForOnlyLastLevel({ data: processedTreeData, childrenKey, onlyLastLevel }); const handleChange = (value, label, extra) => { if (value) { if (getDataType(value) === "Array") { const parentNodes = []; for (let i = 0; i < value.length; i++) { const targetId = (restProps.labelInValue || restProps.treeCheckStrictly) ? value[i].value : value[i]; const currentParentNodes = getTreeNodePaths({ data: treeData, targetId, idKey, childrenKey, isIncludeOneself: onGetNodePathsIsIncludeOneself, }); parentNodes.push(...currentParentNodes); } const deduplicationParentNodes = arrayObjectDeduplication(parentNodes, idKey); onGetNodePaths?.(deduplicationParentNodes); onGetLabel?.((restProps.labelInValue || restProps.treeCheckStrictly) ? value.map(item => item.label) : label); } else { const targetId = (restProps.labelInValue || restProps.treeCheckStrictly) ? value.value : value; const parentNodes = getTreeNodePaths({ data: treeData, targetId, idKey, childrenKey, isIncludeOneself: onGetNodePathsIsIncludeOneself, }); onGetNodePaths?.(parentNodes); onGetLabel?.(parentNodes[parentNodes.length - 1][nameKey]); } } else { onGetNodePaths?.([]); onGetLabel?.(""); } onChange?.((restProps.labelInValue || restProps.treeCheckStrictly) ? value.map(item => item.value) : value, label, extra); }; useEffect(() => { onGetData?.(treeData, processedTreeData); }, [treeData, processedTreeData]); return ( ); } BasicSelectTree.displayName = "BasicSelectTree"; export default BasicSelectTree;