From 15870de8e5d10948ce532544ce052c1140cc22b1 Mon Sep 17 00:00:00 2001 From: Jecyu Date: Thu, 7 Oct 2021 16:49:32 +0800 Subject: [PATCH 1/3] =?UTF-8?q?feat(breadcrumb):=20=E6=B7=BB=E5=8A=A0=20vu?= =?UTF-8?q?e=20=E8=B7=AF=E7=94=B1=E5=B1=9E=E6=80=A7to=E3=80=81replace=20?= =?UTF-8?q?=E7=89=B9=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- devui/breadcrumb/src/breadcrumb-item-types.ts | 14 +++++++++ devui/breadcrumb/src/breadcrumb-item.scss | 9 ++++++ devui/breadcrumb/src/breadcrumb-item.tsx | 29 +++++++++++++++++-- devui/breadcrumb/src/breadcrumb-types.ts | 2 ++ devui/breadcrumb/src/breadcrumb.tsx | 15 +++++++++- docs/components/breadcrumb/index.md | 29 ++++++++++++------- 6 files changed, 84 insertions(+), 14 deletions(-) diff --git a/devui/breadcrumb/src/breadcrumb-item-types.ts b/devui/breadcrumb/src/breadcrumb-item-types.ts index 04542fad..a118789c 100644 --- a/devui/breadcrumb/src/breadcrumb-item-types.ts +++ b/devui/breadcrumb/src/breadcrumb-item-types.ts @@ -26,6 +26,20 @@ export const breadcrumbItemProps = { isSearch: { type: Boolean, dafault: false + }, + /** + * 路由跳转对象,同 vue-router 的 to + */ + to: { + type: [String, Object] as PropType>, + default: '' + }, + /** + * 在使用 to 进行路由跳转时,启用 replace 将不会向 history 添加新记录 + */ + replace: { + type: Boolean, + default: false } } as const diff --git a/devui/breadcrumb/src/breadcrumb-item.scss b/devui/breadcrumb/src/breadcrumb-item.scss index dd06a51a..5c3a6046 100644 --- a/devui/breadcrumb/src/breadcrumb-item.scss +++ b/devui/breadcrumb/src/breadcrumb-item.scss @@ -30,6 +30,15 @@ color $devui-animation-duration-slow $devui-animation-ease-in-out-smooth; } + + .is-link { + cursor: pointer; + + &:hover { + color: $devui-text; + text-decoration: none; + } + } } .devui-breadcrumb-separator { diff --git a/devui/breadcrumb/src/breadcrumb-item.tsx b/devui/breadcrumb/src/breadcrumb-item.tsx index 39a2674a..f8f1ff68 100644 --- a/devui/breadcrumb/src/breadcrumb-item.tsx +++ b/devui/breadcrumb/src/breadcrumb-item.tsx @@ -1,4 +1,11 @@ -import { defineComponent, inject } from 'vue' +import { + defineComponent, + inject, + onMounted, + onBeforeUnmount, + ref, + getCurrentInstance +} from 'vue' import { breadcrumbItemProps, @@ -11,13 +18,31 @@ export default defineComponent({ props: breadcrumbItemProps, setup(props: BreadcrumbItemProps, { slots }) { const separatorIcon = inject('separatorIcon') + const linkClass = props.to ? 'is-link' : '' + const link = ref(null) + const instance = getCurrentInstance() + const router = instance.appContext.config.globalProperties.$router + const handleClickLink = () => { + if (!props.to || !router) return + props.replace ? router.replace(props.to) : router.push(props.to) + } + onMounted(() => { + link.value.addEventListener('click', handleClickLink) + }) + + onBeforeUnmount(() => { + link.value.removeEventListener('click', handleClickLink) + }) + return () => { const renderBreadcrumbSperator = () => { return {separatorIcon} } return (
- {slots?.default()} + + {slots?.default()} + {renderBreadcrumbSperator()}
) diff --git a/devui/breadcrumb/src/breadcrumb-types.ts b/devui/breadcrumb/src/breadcrumb-types.ts index f8d43be8..caebf81b 100644 --- a/devui/breadcrumb/src/breadcrumb-types.ts +++ b/devui/breadcrumb/src/breadcrumb-types.ts @@ -5,6 +5,8 @@ export interface SourceConfig { link?: string // 跳转的路径 target?: string // 规定在何处打开链接文档 noNavigation?: boolean // 链接是否不可跳转,一般用于当前所处位置不可跳转的配置 + linkType?: 'hrefLink' | 'routerLink' // 链接类型,默认为'hrefLink'方式,可选'hrefLink' 或 'routerLink' + replace: boolean // 在使用 to 进行路由跳转时,启用 replace 将不会向 history 添加新记录 } export const breadcrumbProps = { diff --git a/devui/breadcrumb/src/breadcrumb.tsx b/devui/breadcrumb/src/breadcrumb.tsx index 0da81a29..6b5ffeb2 100644 --- a/devui/breadcrumb/src/breadcrumb.tsx +++ b/devui/breadcrumb/src/breadcrumb.tsx @@ -18,15 +18,28 @@ export default defineComponent({ const separatorIcon = getPropsSlot(slots, props, 'separatorIcon') ?? '/' provide('separatorIcon', separatorIcon) + const renderBreadcrumbItemRouted = (item) => { + return ( + + {item.title} + + ) + } const renderBreadItemList = (source: SourceConfig[]) => { return source.map((item: SourceConfig) => { + if (!item.noNavigation && item.linkType === 'routerLink') { + return renderBreadcrumbItemRouted(item) + } return ( - {!item.noNavigation ? ( + {/* hrefLink */} + {!item.noNavigation && + (!item.linkType || item.linkType === 'hrefLink') ? ( {item.title} ) : null} + {/* normal */} {item.noNavigation ? {item.title} : null} ) diff --git a/docs/components/breadcrumb/index.md b/docs/components/breadcrumb/index.md index 2289ae81..bdf9c820 100644 --- a/docs/components/breadcrumb/index.md +++ b/docs/components/breadcrumb/index.md @@ -14,6 +14,7 @@ ```vue