工具- vue3+ts 全局Message 工具

552 阅读3分钟

我报名参加金石计划1期挑战——瓜分10万奖池,这是我的第4篇文章,点击查看活动详情

前言

message 组件是开发过程中最常用的一个组件了,无论是 ajax 请求中对 异常请求 的提示,还是操作成功给用户的反馈,message 都是作为一个最常用的反馈形式被大家使用。

需求拆解

message 组件的使用场景是 broswer,语言默认支持 TS 语法。

message 组件应该独立于系统之外,可以被其他 组件 或 框架 调用。

message 组件应该至少包含如下几个使用场景:

  1. 全局 message 共用一套配置,例如: duration、closedBtn ...
  2. 直接通过 Message[type]('操作成功!'),进行调用。
  3. 除了常规的信息提示,还要包括确认框: MessageBox。

思维扩展:

  1. 支持更多类型的message,例如 可以渲染 html
  2. 支持

思路说明

确定项目的技术选型,例如我这次基于的是 Vue3+ts+ElementPlus 开发环境进行的思路设计并封装的。

鉴于 ElementPlus 已经提供了 ElMessage 组件和 ElMessageBox 组件,可以基于他进行一个简单的封装。

导出结果为一个 Message 类,Message 所有的方法都是 static 类型的,这样的话不需要实例化 Message 就可以直接执行其 静态方法。

Message 导出的方法包含:success、warning、danger、info、delete、access。

源码解读

import { ElMessage, ElMessageBox } from 'element-plus'

// 基础信息
const base = (msg: string) => ({
  duration: 4000,
  showClose: true,
  message: msg,
  dangerouslyUseHTMLString: true
})

// 导出实体类
export default class Message {
  static error(msg: string) {
    return ElMessage({
      type: 'error',
      ...base(msg)
    })
  }

  static success(msg: string) {
    return ElMessage({
      type: 'success',
      ...base(msg)
    })
  }

  static warning(msg: string) {
    return ElMessage({
      type: 'warning',
      ...base(msg)
    })
  }

  static info(msg: string) {
    return ElMessage({
      type: 'info',
      ...base(msg)
    })
  }

  static confirm(msg: string, resovleFn: () => void) {
    return ElMessageBox.confirm(msg, '提示', {
      confirmButtonText: '确定',
      cancelButtonText: '取消',
      type: 'warning'
    })
      .then(() => {
        resovleFn()
      })
      .catch(() => Message.info('哦,原来是点错啦!'))
  }

  static delete(msg: string, resovleFn: () => void) {
    return ElMessageBox.confirm(msg, '删除', {
      confirmButtonText: '确定',
      cancelButtonText: '取消',
      type: 'warning'
    })
      .then(() => {
        resovleFn()
      })
      .catch(() => Message.info('哦,原来是点错啦!'))
  }
}

简单解读

上面就是一个基础版本的 Message 的一个简单封装。

将整个系统中的 Message 归拢为一个 统一的入口,由 Message 这个入口进行分发具体 信息。

在统一入口之前,声明了一个 baseConfig ,作为一个基础配置供所有的 Message 方法进行调用。

其中,前四个:success、warning、danger、info 其实是一样的,只是我习惯于使用 Message.success('操作成功!') 这样的调用方式,所以将其分开写成了四个方法。每个方法的 入参都是基于 字符串,并引用同一套 baseConfig。

后面的 confirm、delete 则是使用了 ElMessageBox 这个组件,入参有两个:

  • msg:作为提示的信息
  • resovleFn:点击确定后的回调函数

点击取消以后,默认为 Message 的 info 方法。

使用方法

直接引入再执行就好了,在 ts 文件和 vue 文件中都可以使用.

import Message from 'Message.ts'

Message.info('哦,原来是点错啦!'))

后记

这个 Message 其实很常见。

有人可能觉得这个东西其实没啥用,如果是一个人开发的项目是这样的,它更适用于多人开发的大型项目中。

在大型项目中,这种 Message 的使用场景会很多,如果多人开发阶段有的人 修改 ElMessage 的基础配置,而有的人则没有,这样一来,如果有一天需要统一这个配置,就很麻烦了。更有甚者,几个大佬开发的项目,每个人都有自己的一套封装,反而会增加学习成本。

所以说,项目初始阶段准备一些东西是很有必要的,而这些小工具则是需要在日常开发过程中不断的积累。以便于在新的项目中有充分的准备。