message.ts 3.5 KB

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