/** * @description MMenuItem component * @author 阿怪 * @date 2023/8/3 16:29 * @version v1.0.0 * * 江湖的业务千篇一律,复杂的代码好几百行。 */ import { defineComponent, h, ref, resolveComponent } from 'vue'; import MLi from '../../base/li/MLi.tsx'; import { TreeNodeData } from '../../base/tree'; import { treeNodeProps } from '../../base/tree/api.ts'; import { TreeNodeProps } from '../../base/tree/treeNode'; type TreeChildren = any; // todo fix this type,maybe use generics type MenuItemProps = TreeNodeProps & { root?: boolean }; export default defineComponent((_props: MenuItemProps) => { const props = _props as Required; const MMenuItem = resolveComponent('MMenuItem'); const itemRef = ref(); const clickEvent = (e: MouseEvent, d: TreeNodeData) => { if (e.target === itemRef.value) { return; } props.handleItemClick?.(d, e); e.stopPropagation(); }; return () => { const { label: l, key: k, children: c } = props.config; return <>{ props.data.map(d => { const children = d[c] ?? []; const cKeys = children.map((it: TreeChildren) => it[k]); const childNodes = props.getNodesByKeys(cKeys); // @ts-ignore todo fix this type return clickEvent(e, d)}> {d[l]} {(childNodes.length > 0 && d.expand) ? : null} ; }) }; }; }, { name: 'MMenuItem', props: { ...treeNodeProps, root: { type: Boolean, default: false }, }, inheritAttrs: false, });