import type { CSSProperties, ExtractPropTypes } from 'vue'; import { defineComponent } from 'vue'; import PropTypes from '../_util/vue-types'; import { getPropsSlot } from '../_util/props-util'; import type { DropdownProps } from '../dropdown/dropdown'; import Dropdown from '../dropdown/dropdown'; import DownOutlined from '@ant-design/icons-vue/DownOutlined'; import useConfigInject from '../config-provider/hooks/useConfigInject'; import type { MouseEventHandler } from '../_util/EventInterface'; import { eventType, objectType } from '../_util/type'; import type { CustomSlotsType, VueNode } from '../_util/type'; export const breadcrumbItemProps = () => ({ prefixCls: String, href: String, separator: PropTypes.any, dropdownProps: objectType(), overlay: PropTypes.any, onClick: eventType(), }); export type BreadcrumbItemProps = Partial>>; export default defineComponent({ compatConfig: { MODE: 3 }, name: 'ABreadcrumbItem', inheritAttrs: false, __ANT_BREADCRUMB_ITEM: true, props: breadcrumbItemProps(), // emits: ['click'], slots: Object as CustomSlotsType<{ separator: any; overlay: any; default: any; }>, setup(props, { slots, attrs, emit }) { const { prefixCls } = useConfigInject('breadcrumb', props); /** * if overlay is have * Wrap a Dropdown */ const renderBreadcrumbNode = (breadcrumbItem: VueNode, prefixCls: string) => { const overlay = getPropsSlot(slots, props, 'overlay'); if (overlay) { return ( {breadcrumbItem} ); } return breadcrumbItem; }; const handleClick = (e: MouseEvent) => { emit('click', e); }; return () => { const separator = getPropsSlot(slots, props, 'separator') ?? '/'; const children = getPropsSlot(slots, props); const { class: cls, style, ...restAttrs } = attrs; let link: VueNode; if (props.href !== undefined) { link = ( {children} ); } else { link = ( {children} ); } // wrap to dropDown link = renderBreadcrumbNode(link, prefixCls.value); if (children !== undefined && children !== null) { return (
  • {link} {separator && {separator}}
  • ); } return null; }; }, });