vxe-pc-ui
Version:
A vue based PC component library
105 lines (88 loc) • 3.15 kB
text/typescript
import { defineComponent, ref, h, reactive, computed, resolveComponent, inject, createCommentVNode, PropType } from 'vue'
import XEUtils from 'xe-utils'
import type { VxeBreadcrumbItemPropTypes, VxeBreadcrumbItemEmits, BreadcrumbItemReactData, BreadcrumbItemPrivateRef, VxeBreadcrumbItemPrivateComputed, VxeBreadcrumbItemConstructor, VxeBreadcrumbItemPrivateMethods, VxeBreadcrumbConstructor, VxeBreadcrumbPrivateMethods } from '../../../types'
export default defineComponent({
name: 'VxeBreadcrumbItem',
props: {
title: String as PropType<VxeBreadcrumbItemPropTypes.Title>,
routerLink: Object as PropType<VxeBreadcrumbItemPropTypes.RouterLink>
},
emits: [
] as VxeBreadcrumbItemEmits,
setup (props, context) {
const { slots } = context
const xID = XEUtils.uniqueId()
const refElem = ref<HTMLDivElement>()
const $xeBreadcrumb = inject<(VxeBreadcrumbConstructor & VxeBreadcrumbPrivateMethods) | null>('$xeBreadcrumb', null)
const reactData = reactive<BreadcrumbItemReactData>({
})
const refMaps: BreadcrumbItemPrivateRef = {
refElem
}
const computeSeparator = computed(() => {
if ($xeBreadcrumb) {
return $xeBreadcrumb.props.separator
}
return ''
})
const clickEvent = (evnt: MouseEvent) => {
if ($xeBreadcrumb) {
const item = {
title: props.title,
routerLink: props.routerLink
}
$xeBreadcrumb.handleClickLink(evnt, item)
}
}
const computeMaps: VxeBreadcrumbItemPrivateComputed = {
}
const $xeBreadcrumbItem = {
xID,
props,
context,
reactData,
getRefMaps: () => refMaps,
getComputeMaps: () => computeMaps
} as unknown as VxeBreadcrumbItemConstructor & VxeBreadcrumbItemPrivateMethods
const renderVN = () => {
const { title, routerLink } = props
const separator = computeSeparator.value
const defaultSlot = slots.default
return h('span', {
ref: refElem,
class: 'vxe-breadcrumb-item',
onClick: clickEvent
}, [
h('span', {
class: 'vxe-breadcrumb-item--content'
}, [
routerLink
? h(resolveComponent('router-link'), {
class: 'vxe-breadcrumb-item--content-link',
title,
to: routerLink
}, {
default () {
return h('span', {
class: 'vxe-breadcrumb-item--content-text'
}, defaultSlot ? defaultSlot({}) : `${title || ''}`)
}
})
: h('span', {
class: 'vxe-breadcrumb-item--content-text'
}, defaultSlot ? defaultSlot({}) : `${title || ''}`)
]),
separator
? h('span', {
class: 'vxe-breadcrumb-item--separator'
}, `${separator}`)
: createCommentVNode()
])
}
$xeBreadcrumbItem.renderVN = renderVN
return $xeBreadcrumbItem
},
render () {
return this.renderVN()
}
})