/** * 消息提示,二次封装 */ import { ElMessage, ElLoading, type MessageOptions } from 'element-plus'; /** * 通用消息封装 * 用于统一项目内消息提示风格 */ type MessageType = 'primary' | 'success' | 'warning' | 'info' | 'error'; // 业务层(你自己用) type PlacementType = 'top' | 'top-left' | 'top-right' | 'bottom' | 'bottom-left' | 'bottom-right' | 'center'; // Element Plus 专用 type ElPlacementType = Exclude; /** * MessageExtensionOptions 拓展消息提示参数 */ export interface MessageExtensionOptions extends MessageOptions { // 是否显示遮罩 mask?: boolean; // 是否显示边框-清新模式 border?: boolean; // 是否loading模式 loading?: boolean; } /** * 默认参数 * @param mask 是否显示遮罩(额外拓展) * @param border 是否显示边框-清新模式(额外拓展) * @param loading 是否loading模式(额外拓展) * @param placement 消息放置位置(原先element就有,新增 'center' 居中) */ const defaultOptions: MessageExtensionOptions = { mask: false, border: false, loading: false, customClass: '', dangerouslyUseHTMLString: false, duration: 30000, icon: undefined, message: '这是一条提示内容', onClose: undefined, showClose: false, type: 'primary' as MessageType, plain: false, offset: 16, placement: 'top' as ElPlacementType, zIndex: 0, grouping: false, repeatNum: 1, }; function message(options: MessageExtensionOptions) { const merged = { ...defaultOptions, ...options }; /** 是否要边框风格 */ if (merged.border) { merged.customClass = [merged.customClass, 'y-message-border'].filter(Boolean).join(' '); } /** 是否要loading风格 */ if (merged.loading) { merged.customClass = [merged.customClass, 'y-message-loading'].filter(Boolean).join(' '); } /** 是否要遮罩层 */ let loadingInstance: ReturnType | null = null; if (merged.mask) { loadingInstance = ElLoading.service({ lock: true, background: 'rgba(0, 0, 0, 0.3)', spinner: '1', // 不显示默认加载图标 text: '', // 不显示文字 }); } /** 位置 */ if ((merged.placement as string) === 'center') { merged.customClass = [merged.customClass, 'y-center'].filter(Boolean).join(' '); } // 创建消息实例 const msg = ElMessage({ ...merged, onClose: () => { // 先执行用户自定义的 onClose merged.onClose?.(); // 再关闭遮罩层 if (loadingInstance) { loadingInstance.close(); loadingInstance = null; } }, }); return msg; } export const Ymessage = Object.assign(message, { primary: (options: MessageExtensionOptions) => message(options), success: (options: MessageExtensionOptions) => message(options), warning: (options: MessageExtensionOptions) => message(options), info: (options: MessageExtensionOptions) => message(options), error: (options: MessageExtensionOptions) => message(options), });