zhangwei
2025-06-26 f397a6cfd118ae36022576374ed4a1fd9e15448d
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
import type { VNode } from "vue";
import { isFunction } from "@pureadmin/utils";
import { type MessageHandler, ElMessage } from "element-plus";
 
type messageStyle = "el" | "antd";
type messageTypes = "info" | "success" | "warning" | "error";
 
interface MessageParams {
  /** 消息类型,可选 `info` 、`success` 、`warning` 、`error` ,默认 `info` */
  type?: messageTypes;
  /** 是否纯色,默认 `false` */
  plain?: boolean;
  /** 自定义图标,该属性会覆盖 `type` 的图标 */
  icon?: any;
  /** 是否将 `message` 属性作为 `HTML` 片段处理,默认 `false` */
  dangerouslyUseHTMLString?: boolean;
  /** 消息风格,可选 `el` 、`antd` ,默认 `antd` */
  customClass?: messageStyle;
  /** 显示时间,单位为毫秒。设为 `0` 则不会自动关闭,`element-plus` 默认是 `3000` ,平台改成默认 `2000` */
  duration?: number;
  /** 是否显示关闭按钮,默认值 `false` */
  showClose?: boolean;
  /** `Message` 距离窗口顶部的偏移量,默认 `16` */
  offset?: number;
  /** 设置组件的根元素,默认 `document.body` */
  appendTo?: string | HTMLElement;
  /** 合并内容相同的消息,不支持 `VNode` 类型的消息,默认值 `false` */
  grouping?: boolean;
  /** 重复次数,类似于 `Badge` 。当和 `grouping` 属性一起使用时作为初始数量使用,默认值 `1` */
  repeatNum?: number;
  /** 关闭时的回调函数, 参数为被关闭的 `message` 实例 */
  onClose?: Function | null;
}
 
/** 用法非常简单,参考 src/views/components/message/index.vue 文件 */
 
/**
 * `Message` 消息提示函数
 */
const message = (
  message: string | VNode | (() => VNode),
  params?: MessageParams
): MessageHandler => {
  if (!params) {
    return ElMessage({
      message,
      customClass: "pure-message"
    });
  } else {
    const {
      icon,
      type = "info",
      plain = false,
      dangerouslyUseHTMLString = false,
      customClass = "antd",
      duration = 2000,
      showClose = false,
      offset = 16,
      appendTo = document.body,
      grouping = false,
      repeatNum = 1,
      onClose
    } = params;
 
    return ElMessage({
      message,
      icon,
      type,
      plain,
      dangerouslyUseHTMLString,
      duration,
      showClose,
      offset,
      appendTo,
      grouping,
      repeatNum,
      // 全局搜 pure-message 即可知道该类的样式位置
      customClass: customClass === "antd" ? "pure-message" : "",
      onClose: () => (isFunction(onClose) ? onClose() : null)
    });
  }
};
 
/**
 * 关闭所有 `Message` 消息提示函数
 */
const closeAllMessage = (): void => ElMessage.closeAll();
 
export { message, closeAllMessage };