import './index.less' import { reactiveOmit } from '@vueuse/core' import type { VueNodeOrRender } from '#/types' import type { RouteContextType } from '../../RouteContext' import type { CSSProperties, PropType, VNode } from 'vue' import { VueNodeOrRenderPropType } from '#/types' import { getPrefixCls, routeContextInjectKey } from '../../RouteContext' export type FooterToolbarProps = { extra?: VueNodeOrRender renderContent?: ( props: FooterToolbarProps & RouteContextType & { leftWidth?: string }, dom: JSX.Element ) => VNode prefixCls?: string } const FooterToolbar = defineComponent({ props: { extra: VueNodeOrRenderPropType as PropType, renderContent: { type: Function as PropType, default: undefined }, prefixCls: { type: String, default: undefined } }, setup(props, { slots, attrs }) { const routeContext = inject(routeContextInjectKey, {}) const prefixCls = props.prefixCls || getPrefixCls('pro') const baseClassName = `${prefixCls}-footer-bar` const width = computed(() => { if (!routeContext.hasSiderMenu) { return undefined } // 0 or undefined if (!routeContext.siderWidth) { return '100%' } return routeContext.isMobile ? '100%' : `calc(100% - ${routeContext.siderWidth}px)` }) /** 告诉 props 是否存在 footerBar */ onMounted(() => routeContext?.setHasFooterToolbar?.(true)) onUnmounted(() => routeContext?.setHasFooterToolbar?.(false)) return () => { const dom = ( <>
{props.extra}
{slots.default?.()}
) return (
{props.renderContent ? props.renderContent( { ...props, ...routeContext, leftWidth: width.value }, dom ) : dom}
) } } }) export default FooterToolbar