import { defineComponent, type Slots } from 'vue' /** * @description 基础组件 * @example * ```tsx * * * * * * * * * * * ``` */ export default defineComponent({ name: 'BaseComponent', setup(_, { slots }: { slots: Slots }) { // 获取插槽内容,支持驼峰和短横线两种命名方式 const slotHL = slots['header-left'] || slots.headerLeft const slotHR = slots['header-right'] || slots.headerRight const slotHeader = slots.header // 新增对 #header 插槽的支持 const slotFL = slots['footer-left'] || slots.footerLeft const slotFR = slots['footer-right'] || slots.footerRight const slotFooter = slots.footer // 新增对 #footer 插槽的支持 return () => (
{/* 头部区域: 优先使用 #header 插槽,如果不存在则尝试 #header-left 和 #header-right */} {slotHeader ? (
{slotHeader()}
) : ( (slotHL || slotHR) && (
{slotHL && slotHL()}
{slotHR && slotHR()}
) )} {/* 内容区域 */}
{slots.content && slots.content()}
{/* 底部区域: 优先使用 #footer 插槽,如果不存在则尝试 #footer-left 和 #footer-right */} {slotFooter ? (
{slotFooter()}
) : ( (slotFL || slotFR) && (
{slotFL && slotFL()}
{slotFR && slotFR()}
) )} {/* 弹窗区域 */} {slots.popup && slots.popup()}
) }, })