UNPKG

xdesign-vue-next

Version:

XDesign Component for vue-next

1 lines 3.79 kB
{"version":3,"file":"slot.mjs","sources":["../../src/hooks/slot.ts"],"sourcesContent":["import { Slots, VNode, Component, getCurrentInstance, Fragment, Comment } from 'vue';\nimport isArray from 'lodash/isArray';\n\n/**\n * Render the default slot and retrieve the VNodes of child components. Handles multiple scenarios for creating child components.\n * Use case: <x-steps> <x-steps-item /> </x-steps>, <x-steps> <x-steps-item v-for=\"(item, index)\" :key=\"index\" /> </x-steps>\n * @returns {function(childComponentName: string, slots: Slots): VNode[]}\n * @param childComponentName The name of the child component\n * @param slots The slots object\n * @example const getChildByName = useChildComponentSlots()\n * @example getChildComponentByName('TStepItem')\n */\nexport function useChildComponentSlots() {\n const instance = getCurrentInstance();\n return (childComponentName: string, slots?: Slots): VNode[] => {\n if (!slots) {\n slots = instance.slots;\n }\n const content = slots?.default?.() || [];\n\n // 满足基于基础组件封装场景,递归找到子组件\n const childList: VNode[] = [];\n const getChildren = (content: VNode[]) => {\n if (!isArray(content)) return;\n content.forEach((item: VNode) => {\n if (item.children && isArray(item.children)) {\n if (item.type !== Fragment) return;\n getChildren(item.children as VNode[]);\n } else {\n childList.push(item);\n }\n });\n return childList;\n };\n\n return getChildren(content).filter((item: VNode) =>\n (item.type as Component).name?.endsWith(childComponentName),\n ) as VNode[];\n };\n}\n\n/**\n * Render the default slot and retrieve the child slots.\n * @param childComponentName The name of the child component.\n * @param slots The slots object.\n * @returns {function(): VNode[]}\n * @example const getChildSlots = useChildSlots()\n * @example getChildSlots()\n */\nexport function useChildSlots() {\n const instance = getCurrentInstance();\n return () => {\n const { slots } = instance;\n const content = slots?.default?.() || [];\n\n return content\n .filter((item) => {\n if (typeof item.type === 'symbol' && !item.children) {\n return false;\n }\n return item.type !== Comment;\n })\n .map((item) => {\n if (item.children && isArray(item.children) && item.type === Fragment) return item.children;\n return item;\n })\n .flat();\n };\n}\n"],"names":["isArray","content","getChildren","childList"],"mappings":";;;;;;;;;;;AAYO,SAAA,sBAAA,GAAA;AACL,EAAA,IAAA,QAAA,GAAA,kBAAA,EAAA,CAAA;AACO,EAAA,OAAA,UAAA,kBAAA,EAAA,KAAA,EAAA;;;;AAGL,KAAA;;;AAKM,IAAA,IAAA,WAAA,GAAA,SAAA,WAAA,CAAA,QAAA,EAAA;AACA,MAAA,IAAA,CAAAA,SAAA,CAAA,QAAA,CAAA,EAAA,OAAA;AACJC,MAAAA,QAAAA,CAAAA,OAAAA,CAAAA,UAAAA,IAAAA,EAAAA;;AAEI,UAAA,IAAA,IAAA,CAAA,IAAA,KAAA,QAAA,EAAA,OAAA;AACAC,UAAAA,WAAAA,CAAAA,IAAAA,CAAAA,QAAAA,CAAAA,CAAAA;AACF,SAAA,MAAA;AACEC,UAAAA,SAAAA,CAAAA,IAAAA,CAAAA,IAAAA,CAAAA,CAAAA;AACF,SAAA;AACF,OAAA,CAAA,CAAA;AACO,MAAA,OAAA,SAAA,CAAA;;;AAIN,MAAA,IAAA,eAAA,CAAA;AAAA,MAAA,OAAA,CAAA,eAAA,GAAA,IAAA,CAAA,IAAA,CAAA,IAAA,MAAA,IAAA,IAAA,eAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,eAAA,CAAA,QAAA,CAAA,kBAAA,CAAA,CAAA;AAAyD,KAAA,CAAA,CAAA;;AAGhE,CAAA;AAUO,SAAA,aAAA,GAAA;AACL,EAAA,IAAA,QAAA,GAAA,kBAAA,EAAA,CAAA;AACA,EAAA,OAAA,YAAA;AAAa,IAAA,IAAA,eAAA,CAAA;AACL,IAAA,IAAA,KAAA,GAAA,QAAA,CAAA,KAAA,CAAA;;AAGC,IAAA,OAAA,OAAA,CAAA,MAAA,CAAA,UAAA,IAAA,EAAA;AAEH,MAAA,IAAA,OAAA,CAAA,IAAA,CAAA,IAAA,CAAA,KAAA,QAAA,IAAA,CAAA,IAAA,CAAA,QAAA,EAAA;AACS,QAAA,OAAA,KAAA,CAAA;AACT,OAAA;AACA,MAAA,OAAA,IAAA,CAAA,IAAA,KAAA,OAAA,CAAA;AACF,KAAA,CAAA,CAAA,GAAA,CAAA,UAAA,IAAA,EAAA;;AAGS,MAAA,OAAA,IAAA,CAAA;AACT,KAAA,CAAA,CAAA,IAAA,EAAA,CAAA;;AAGN;;;;"}