diff --git a/packages/devui-vue/devui/accordion/src/accordion-item-hreflink.tsx b/packages/devui-vue/devui/accordion/src/accordion-item-hreflink.tsx new file mode 100644 index 0000000000..9ac9501716 --- /dev/null +++ b/packages/devui-vue/devui/accordion/src/accordion-item-hreflink.tsx @@ -0,0 +1,127 @@ +import { defineComponent, toRefs, computed, inject } from 'vue' +import { accordionProps } from './accordion-types' +import { AccordionItemClickEvent, AccordionMenuItem, AccordionLinkableItem } from './accordion.type' +import DAccordionItem from './accordion-item' +import { getRootSlots } from './utils' + +export default defineComponent({ + name: 'DAccordionItemHreflink', + component: { + DAccordionItem + }, + props: { + item: Object as () => AccordionLinkableItem, + deepth: { + type: Number, + default: 0 + }, + parent: { + type: Object as () => AccordionMenuItem, + default: null + }, + ...accordionProps + }, + setup(props) { + const { + item, + deepth, + parent, + titleKey, + linkKey, + linkTargetKey, + linkDefaultTarget, + // activeKey, + disabledKey, + itemTemplate + } = toRefs(props) + + const rootSlots = getRootSlots() + const accordionCtx = inject('accordionContext') as any + + const title = computed(() => { + return item.value && item.value[titleKey.value] + }) + + const link = computed(() => { + return item.value && item.value[linkKey.value] + }) + + // const active = computed(() => { + // return item.value && item.value[activeKey.value] + // }) + + // const childActived = computed(() => { + // return active.value + // }) + + const target = computed(() => { + return item.value && (item.value[linkTargetKey.value] || linkDefaultTarget.value) + }) + + const disabled = computed(() => { + return item.value && item.value[disabledKey.value] + }) + + const parentValue = parent.value + const deepValue = deepth.value + + const linkItemClickFn = (itemEvent: AccordionItemClickEvent) => { + if (item.value && !disabled.value) { + accordionCtx.itemClickFn(itemEvent) + } + } + + const renderContent = () => { + return ( + <> +
+ {(!rootSlots.itemTemplate || itemTemplate.value === false) && <>{title.value}} + {rootSlots.itemTemplate && + itemTemplate.value !== false && + rootSlots.itemTemplate?.({ + parent: parentValue, + deepth: deepValue, + item: item.value + })} + + ) + } + + return () => { + return ( + <> +
+ {!disabled.value && ( + + linkItemClickFn({ + item: item.value, + parent: parentValue, + event: e + }) + } + > + {renderContent()} + + )} + {disabled.value && ( + + {renderContent()} + + )} +
+ + ) + } + } +}) diff --git a/packages/devui-vue/devui/accordion/src/accordion-item-routerlink.tsx b/packages/devui-vue/devui/accordion/src/accordion-item-routerlink.tsx new file mode 100644 index 0000000000..44e55522bb --- /dev/null +++ b/packages/devui-vue/devui/accordion/src/accordion-item-routerlink.tsx @@ -0,0 +1,147 @@ +import { defineComponent, toRefs, computed, inject } from 'vue' +import { useRoute } from 'vue-router' +import { accordionProps } from './accordion-types' +import { AccordionItemClickEvent, AccordionMenuItem, AccordionLinkableItem } from './accordion.type' +import DAccordionItem from './accordion-item' +import { getRootSlots } from './utils' + +export default defineComponent({ + name: 'DAccordionItemRouterlink', + component: { + DAccordionItem + }, + props: { + item: Object as () => AccordionLinkableItem, + deepth: { + type: Number, + default: 0 + }, + parent: { + type: Object as () => AccordionMenuItem, + default: null + }, + ...accordionProps + }, + setup(props) { + const { + item, + deepth, + parent, + titleKey, + linkKey, + linkDefaultTarget, + disabledKey, + itemTemplate + } = toRefs(props) + + const route = useRoute() + const rootSlots = getRootSlots() + const accordionCtx = inject('accordionContext') as any + console.log(useRoute()) + + const title = computed(() => { + return item.value && item.value[titleKey.value] + }) + + const link = computed(() => { + return item.value && item.value[linkKey.value] + }) + + const isUsedVueRouter = computed(() => route !== undefined) + + const routerLinkActive = computed(() => { + return route === link.value + }) + + const disabled = computed(() => { + return item.value && item.value[disabledKey.value] + }) + + const parentValue = parent.value + const deepValue = deepth.value + + const linkItemClickFn = (itemEvent: AccordionItemClickEvent) => { + if (item.value && !disabled.value) { + accordionCtx.itemClickFn(itemEvent) + } + } + + const renderContent = () => { + return ( + <> +
+ {(!rootSlots.itemTemplate || itemTemplate.value === false) && <>{title.value}} + {rootSlots.itemTemplate && + itemTemplate.value !== false && + rootSlots.itemTemplate?.({ + parent: parentValue, + deepth: deepValue, + item: item.value + })} + + ) + } + + return () => { + return ( + <> +
+ {!disabled.value && ( + <> + {isUsedVueRouter.value && ( + // TODO: vue-router解决方案 + + linkItemClickFn({ + item: item.value, + parent: parentValue, + event: e + }) + } + > + {renderContent()} + + )} + {!isUsedVueRouter.value && ( + + linkItemClickFn({ + item: item.value, + parent: parentValue, + event: e + }) + } + > + {renderContent()} + + )} + + )} + {disabled.value && ( + + {renderContent()} + + )} +
+ + ) + } + } +}) diff --git a/packages/devui-vue/devui/accordion/src/accordion-list.tsx b/packages/devui-vue/devui/accordion/src/accordion-list.tsx index 8c3d05cfa1..e079dcc030 100644 --- a/packages/devui-vue/devui/accordion/src/accordion-list.tsx +++ b/packages/devui-vue/devui/accordion/src/accordion-list.tsx @@ -1,12 +1,9 @@ -import { - computed, - defineComponent, - inject, - toRefs -} from 'vue' +import { computed, defineComponent, inject, toRefs } from 'vue' import type { AccordionMenuItem } from './accordion.type' import DAccordionMenu from './accordion-menu' import DAccordionItem from './accordion-item' +import DAccordionItemHreflink from './accordion-item-hreflink' +import DAccordionItemRouterlink from './accordion-item-routerlink' import { accordionProps } from './accordion-types' import { getRootSlots } from '../src/utils' @@ -14,7 +11,9 @@ export default defineComponent({ name: 'DAccordionList', components: { DAccordionMenu, - DAccordionItem + DAccordionItem, + DAccordionItemHreflink, + DAccordionItemRouterlink }, inheritAttrs: false, props: { @@ -44,6 +43,7 @@ export default defineComponent({ showNoContent, loadingKey, titleKey, + linkTypeKey, loadingTemplate, noContentTemplate, innerListTemplate @@ -59,6 +59,7 @@ export default defineComponent({ const loading = computed(() => { return parentValue && parentValue[loadingKey.value] }) + const noContent = computed(() => { const dataValue = data.value return dataValue === undefined || dataValue === null || dataValue.length === 0 @@ -67,7 +68,9 @@ export default defineComponent({ return () => { return ( <> - {(!rootSlots.innerListTemplate || deepth.value === 0 || innerListTemplate.value === false) && ( + {(!rootSlots.innerListTemplate || + deepth.value === 0 || + innerListTemplate.value === false) && (