UNPKG

xdesign-vue-next

Version:

XDesign Component for vue-next

1 lines 5.92 kB
{"version":3,"file":"useDropdownOptions.mjs","sources":["../../../src/dropdown/hooks/useDropdownOptions.ts"],"sourcesContent":["import { computed, ComputedRef, VNode, getCurrentInstance, Slots } from 'vue';\nimport isString from 'lodash/isString';\nimport isArray from 'lodash/isArray';\nimport camelCase from 'lodash/camelCase';\n\nimport { useChildComponentSlots } from '../../hooks/slot';\nimport type { DropdownOption, TdDropdownProps } from '../type';\n\nexport const getOptionsFromChildren = (menuNode: VNode | VNode[]): DropdownOption[] => {\n if (!menuNode) return [];\n\n // 处理内部嵌套场景\n if (menuNode[0]?.type?.name === 'XDropdownMenu') {\n const groupChildren = menuNode[0]?.children?.default?.() as VNode;\n if (isArray(groupChildren)) {\n return getOptionsFromChildren(groupChildren);\n }\n }\n\n if (isArray(menuNode)) {\n menuNode = menuNode.reduce((acc, item) => {\n acc = acc.concat(isArray(item.children) ? item.children : item);\n return acc;\n }, []);\n return menuNode\n .map((item) => {\n const slotContent = (item.children as any)?.content?.();\n const slotPrefixIcon = (item.children as any)?.prefixIcon?.() || (item.children as any)?.['prefix-icon']?.();\n const groupChildren = (item.children as any)?.default?.();\n\n // 当前节点的渲染内容\n const contentCtx = groupChildren?.filter?.(\n (v: VNode) => !['XDropdownMenu', 'XDropdownItem'].includes((v.type as { name: string })?.name),\n );\n // 嵌套菜单的节点\n const childrenCtx = groupChildren?.filter?.(\n (v: VNode) =>\n !isString(v.children) && ['XDropdownMenu', 'XDropdownItem'].includes((v.type as { name: string })?.name),\n );\n\n // 将item.props的属性名都转成驼峰,再进行传递\n const itemProps = Object.keys(item.props || {}).reduce((props, propName) => {\n props[camelCase(propName)] = item.props[propName];\n return props;\n }, {});\n\n return {\n content: slotContent || contentCtx || groupChildren,\n ...itemProps,\n ...(slotPrefixIcon ? { prefixIcon: () => slotPrefixIcon } : {}),\n children: childrenCtx?.length > 0 ? getOptionsFromChildren(childrenCtx) : null,\n };\n })\n .filter((v) => !!v.content);\n }\n\n // 处理v-if的场景\n if (isArray(menuNode[0]?.children)) return getOptionsFromChildren(menuNode[0]?.children);\n\n return [];\n};\n\nexport default function useDropdownOptions(props: TdDropdownProps): ComputedRef<DropdownOption[]> {\n const getChildComponentSlots = useChildComponentSlots();\n const instance = getCurrentInstance();\n const menuSlot =\n (getChildComponentSlots('DropdownMenu')?.[0]?.children as Slots)?.default?.() || instance.slots?.dropdown?.();\n\n const dropdownOptions = computed(() => {\n if (props.options && props.options.length > 0) return props.options;\n\n return getOptionsFromChildren(menuSlot);\n });\n return dropdownOptions;\n}\n"],"names":["isArray","acc","props","content","children"],"mappings":"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"}