Tree

37 阅读1分钟

import lodash from 'lodash'; import { useModel } from 'umi'; import { utils } from '@/utils/utils'; import { DataNode } from 'antd/lib/tree'; import React, { useEffect, useMemo, useState } from 'react'; import { Empty, Spin, Tree } from 'antd'; import * as restfulApi from '@/services/api/index';

export interface RouteTreeRenterSelectProps { merchantId: string value?: string[]; isRefetch?: boolean; loading?: boolean; onChange?: (value?: string[], access?: any[]) => void; }

const convertCheckedKeys = (accessData: any[], value?: string[]): string[] => { if (!value) return []; const access: any[] = value.map((id) => lodash.find(accessData, { id })).filter((it) => !!it);

return access .filter((_access) => lodash.isEmpty(accessData.filter((it) => it?.parentId === _access?.id)), ) .map((it) => it?.id); };

const RouteTreeRenterSelect: React.FC = ({ merchantId, value, isRefetch, loading: loadingByProps, onChange, }) => { // @ts-ignore const { initialState } = useModel('@@initialState');

const [loading, setLoading] = useState(false); const [dataSource, setDataSource] = useState<any[]>([]); const [expandedKeys, setExpandedKeys] = useState<string[]>([]);

useEffect(() => { accessListLoad(); }, [])

useEffect(() => { if (loadingByProps) { setLoading(loadingByProps) } }, [loadingByProps])

const treeData: DataNode[] = useMemo(() => { const routes = dataSource.map((it) => { return { ...it, key: it.id, title: ${it.menuName}, }; });

return utils.arrayToTree(routes, 'id', 'parentId');

}, [dataSource])

const newCheckedKeys = useMemo(() => { return convertCheckedKeys(dataSource, value); }, [dataSource, value])

useEffect(() => { setExpandedKeys(treeData.map((it) => it.key) as string[]); }, [loading, treeData]);

useEffect(() => { accessListLoad(); }, [!!isRefetch]);

const accessListLoad = async () => { setLoading(true) const result = await restfulApi.roleListByMerchantId(merchantId);

setLoading(false)
if (result?.data && !lodash.isEmpty(result?.data)) {
  setDataSource(result?.data)
}

}

if (!loading && lodash.isEmpty(dataSource)) { return ; }

return ( <Tree treeData={treeData} selectable={false} checkable expandedKeys={expandedKeys} defaultCheckedKeys={newCheckedKeys} onCheck={(keys, e) => { const { halfCheckedKeys } = e; if (onChange) { const newValue = [...(keys as string[]), ...(halfCheckedKeys as string[])]; onChange( newValue, dataSource.filter((it) => newValue.indexOf(it.id) !== -1), ); } }} onExpand={(keys) => { setExpandedKeys(keys as string[]); }} /> ); };

export default RouteTreeRenterSelect;