1、实现toast插件封装(类似简易版的elementUi的message)
先书写一个toast组件
{{ message }}
然后书写对应的toast.ts
import Vue from 'vue';
// toast组件
import toastComponent from '@/components/toast/index.vue'
// 返回一个 扩展实例构造器
const ToastConstructor = Vue.extend(toastComponent)
// 定义弹出组件的函数 接收2个参数, 要显示的文本 和 显示时间
function showToast(data: { message: any, type: string, duration?: number }) {
// 实例化一个 toast.vue
const toastDom: any = new ToastConstructor({
el: document.createElement('div'),
data() {
return {
message: data.message,
type: data.type,
}
}
});
// 把 实例化的 toast.vue 添加到 body 里
document.body.appendChild(toastDom.$el);
setTimeout(() => { toastDom.showToast(); })
// 过了 duration 时间后隐藏
let duration = data.duration ? data.duration : 2000
setTimeout(() => {
toastDom.hideToast();
setTimeout(() => {
document.body.removeChild(toastDom.$el)
}, 500)
}, duration)
}
// 注册为全局组件的函数
function registryToast() {
// 将组件注册到 vue 的 原型链里去,
// 这样就可以在所有 vue 的实例里面使用 this.$toast()
Vue.prototype.$toast = showToast
}
export default registryToast;然后在main.ts中注册
// 自定义toast插件 import toastMessage from '@/utils/toast.ts'; Vue.use(toastMessage)
然后就可以在全局地方使用
this.$toast({message:"成功",type:'success'})效果如下:

2、实现$confirm插件封装(类似简易版的elementUi的messageBox)
主要用于操作的二次确定
还是一样,首先书写confirm组件
这里按钮点击事件我设置了一个callback回调,用于方便后面的操作交互
{{ title }}
{{ contentText }}
对应的书写confirm.ts
这里使用Promise来为用户点击确定或者取消做对应的交互触发
import Vue from 'vue';
import confirm from '@/components/confirm/index.vue';
const confirmConstructor = Vue.extend(confirm);
const showConfirm = (contentText: string) => {
return new Promise((reslove, reject) => {
const confirmDom: any = new confirmConstructor({
el: document.createElement('template'),
data() {
return {
contentText,
}
},
})
confirmDom.callback = (action: string) => {
if (action === 'confirm') {
reslove()
} else if (action === 'cancel') {
reject()
}
}
document.body.appendChild(confirmDom.$el);
})
}
function registryConfirm() {
// 将组件注册到 vue 的 原型链里去,
// 这样就可以在所有 vue 的实例里面使用 this.$toast()
Vue.prototype.$confirm = showConfirm
}
export default registryConfirm;接下来在main.ts中
import registryConfirm from '@/utils/confirm.ts'; Vue.use(registryConfirm)
然后就可以在全局使用
this.$confirm('是否确认删除')
.then(() => {
this.$toast({
message: '删除成功',
type: 'success',
});
})
.catch(() => {});效果如下

这时,点击确定按钮就会触发 .then里的事件,点击取消则触发 .catch里的事件
typescript对应的声明文件
typescript书写自定义插件对应的声明文件,避免编辑报错
import Vue from "vue";
declare module "vue/types/vue" {
interface Vue {
$toast: any,
$confirm: any
}
}