diff --git a/packages/components/breadcrumb/__tests__/breadcrumb.spec.ts b/packages/components/breadcrumb/__tests__/breadcrumb.spec.ts index 4d40b22a5a..cde1f700b9 100644 --- a/packages/components/breadcrumb/__tests__/breadcrumb.spec.ts +++ b/packages/components/breadcrumb/__tests__/breadcrumb.spec.ts @@ -1,6 +1,6 @@ import { mount } from '@vue/test-utils' -import Breadcrumb from '../src/index.vue' -import BreadcrumbItem from '../src/item.vue' +import Breadcrumb from '../src/breadcrumb.vue' +import BreadcrumbItem from '../src/breadcrumb-item.vue' const _mount = (template: string) => mount( diff --git a/packages/components/breadcrumb/index.ts b/packages/components/breadcrumb/index.ts index 51c5346005..584ac03b0c 100644 --- a/packages/components/breadcrumb/index.ts +++ b/packages/components/breadcrumb/index.ts @@ -1,20 +1,13 @@ -import Breadcrumb from './src/index.vue' -import BreadcrumbItem from './src/item.vue' +import { withInstall } from '@element-plus/utils/with-install' -import type { App } from 'vue' -import type { SFCWithInstall } from '@element-plus/utils/types' +import Breadcrumb from './src/breadcrumb.vue' +import BreadcrumbItem from './src/breadcrumb-item.vue' -Breadcrumb.install = (app: App): void => { - app.component(Breadcrumb.name, Breadcrumb) - app.component(BreadcrumbItem.name, BreadcrumbItem) -} - -Breadcrumb.BreadcrumbItem = BreadcrumbItem - -const _Breadcrumb = Breadcrumb as any as SFCWithInstall & { - BreadcrumbItem: typeof BreadcrumbItem -} - -export default _Breadcrumb -export const ElBreadcrumb = _Breadcrumb +export const ElBreadcrumb = withInstall(Breadcrumb, { + BreadcrumbItem, +}) export const ElBreadcrumbItem = BreadcrumbItem +export default ElBreadcrumb + +export * from './src/breadcrumb' +export * from './src/breadcrumb-item' diff --git a/packages/components/breadcrumb/src/breadcrumb-item.ts b/packages/components/breadcrumb/src/breadcrumb-item.ts new file mode 100644 index 0000000000..3ba266b99e --- /dev/null +++ b/packages/components/breadcrumb/src/breadcrumb-item.ts @@ -0,0 +1,16 @@ +import { buildProp } from '@element-plus/utils/props' + +import type { ExtractPropTypes } from 'vue' +import type { RouteLocationRaw } from 'vue-router' + +export const breadcrumbItemProps = { + to: buildProp({ + type: [String, Object], + default: '', + }), + replace: { + type: Boolean, + default: false, + }, +} as const +export type BreadcrumbItemProps = ExtractPropTypes diff --git a/packages/components/breadcrumb/src/item.vue b/packages/components/breadcrumb/src/breadcrumb-item.vue similarity index 60% rename from packages/components/breadcrumb/src/item.vue rename to packages/components/breadcrumb/src/breadcrumb-item.vue index e4df36451e..46c6a91d16 100644 --- a/packages/components/breadcrumb/src/item.vue +++ b/packages/components/breadcrumb/src/breadcrumb-item.vue @@ -11,10 +11,10 @@ v-if="separatorClass" class="el-breadcrumb__separator" :class="separatorClass" - > - {{ - separator - }} + /> + + {{ separator }} + @@ -26,30 +26,28 @@ import { onMounted, getCurrentInstance, } from 'vue' -import type { PropType } from 'vue' -import type { IBreadcrumbProps } from './breadcrumb' +import { elBreadcrumbKey } from '@element-plus/tokens' +import { breadcrumbItemProps } from './breadcrumb-item' + +import type { Router } from 'vue-router' + +const COMPONENT_NAME = 'ElBreadcrumbItem' export default defineComponent({ - name: 'ElBreadcrumbItem', - props: { - to: { - type: [String, Object] as PropType>, - default: '', - }, - replace: { - type: Boolean, - default: false, - }, - }, + name: COMPONENT_NAME, + + props: breadcrumbItemProps, + setup(props) { - const link = ref(null) - const parent = inject('breadcrumb') - const instance = getCurrentInstance() - const router = instance.appContext.config.globalProperties.$router + const instance = getCurrentInstance()! + const router = instance.appContext.config.globalProperties.$router as Router + const parent = inject(elBreadcrumbKey, undefined) + + const link = ref() onMounted(() => { - link.value.setAttribute('role', 'link') - link.value.addEventListener('click', () => { + link.value!.setAttribute('role', 'link') + link.value!.addEventListener('click', () => { if (!props.to || !router) return props.replace ? router.replace(props.to) : router.push(props.to) }) diff --git a/packages/components/breadcrumb/src/breadcrumb.ts b/packages/components/breadcrumb/src/breadcrumb.ts index 0fba4ce259..a6795cccbc 100644 --- a/packages/components/breadcrumb/src/breadcrumb.ts +++ b/packages/components/breadcrumb/src/breadcrumb.ts @@ -1,4 +1,13 @@ -export interface IBreadcrumbProps { - separator: string - separatorClass: string -} +import type { ExtractPropTypes } from 'vue' + +export const breadcurmbProps = { + separator: { + type: String, + default: '/', + }, + separatorClass: { + type: String, + default: '', + }, +} as const +export type BreadcrumbProps = ExtractPropTypes diff --git a/packages/components/breadcrumb/src/index.vue b/packages/components/breadcrumb/src/breadcrumb.vue similarity index 58% rename from packages/components/breadcrumb/src/index.vue rename to packages/components/breadcrumb/src/breadcrumb.vue index ced7f0c970..385e936e38 100644 --- a/packages/components/breadcrumb/src/index.vue +++ b/packages/components/breadcrumb/src/breadcrumb.vue @@ -11,27 +11,21 @@