很久之前,由于 Vuetify 没有全局消息通知组件,所以基于 v-alert 自己封装了一个简单的 全局消息通知工具,有人一直诟病说没有全局确认框组件,最近终于抽空基于v-dialog也简单封装了一下,够用。
下面直接上代码,有不明白的欢迎评论交流。
提示:下面代码基于 Vue3 + Nuxt3,所以很多资源不需要手动引入,如 ref 等,如果你在非 Nuxt3 环境使用,请手动调试修改代码,相信这难不住你对吧~
html<script setup lang="ts">
import {
  openConfirmDialogFlag,
  ThisConfirmModel,
  GlobalConfirmModels,
} from "~/utils/store";
const cancel = () => {
  if (ThisConfirmModel.value && ThisConfirmModel.value.cancel) {
    ThisConfirmModel.value.cancel();
  }
  closeConfirm();
};
const close = () => {
  if (ThisConfirmModel.value && ThisConfirmModel.value.close) {
    ThisConfirmModel.value.close();
  }
  closeConfirm();
};
const confirm = () => {
  ThisConfirmModel.value?.confirm();
  closeConfirm();
};
const closeConfirm = () => {
  openConfirmDialogFlag.value = false;
  // 原本想实现多层级确认框回显的,但使用有限,所以先注释掉不管了
  // ThisConfirmModel.value = model;
  // if (GlobalConfirmModels.value.length > 0) {
  //   setTimeout(() => {
  //     const model = GlobalConfirmModels.value.shift();
  //     openConfirmDialogFlag.value = true;
  //   }, 100);
  // }
};
</script>
<template>
  <v-dialog
    v-model="openConfirmDialogFlag"
    transition="dialog-bottom-transition"
    max-width="30rem"
    persistent
  >
    <v-card v-if="ThisConfirmModel">
      <v-card-title class="text-h5">
        {{ ThisConfirmModel.title }}
      </v-card-title>
      <v-card-text v-show="ThisConfirmModel?.content">
        {{ ThisConfirmModel.content }}
      </v-card-text>
      <v-card-actions>
        <v-btn color="" @click="cancel()">取消 </v-btn>
        <v-btn color="primary" @click="confirm()">确定 </v-btn>
      </v-card-actions>
    </v-card>
  </v-dialog>
</template>
<style scoped></style>
ts
// 打开确认框标识
export const openConfirmDialogFlag = ref(false);
export const ThisConfirmModel = ref<ConfirmModel>();
// 单层级确认框用不到
// export const GlobalConfirmModels = ref<ConfirmModel[]>([]);
// ConfirmModel 如下
export interface ConfirmModel {
  title: string;
  content: string;
  confirm: Function;
  cancel?: Function;
  close?: Function;
}
tsexport class Confirm {
  // 通过调用 Confirm.open 函数即可打开确认框
  static open = (model: ConfirmModel) => {
    if (openConfirmDialogFlag.value && ThisConfirmModel.value) {
      // 如果是弹窗接弹窗,延迟100ms再打开
      openConfirmDialogFlag.value = false;
      setTimeout(() => {
        ThisConfirmModel.value = model;
        openConfirmDialogFlag.value = true;
      }, 100);
    } else {
      // 如果是第一个弹窗,直接打开
      ThisConfirmModel.value = model;
      openConfirmDialogFlag.value = true;
    }
  };
}
在普通的 Vue 项目中,可以在 App.vue 文件中引入组件 GlobalConfirm.vue,这样相当于使 GlobalConfirm 全局注册,使其全局可用。
如果不需要全局可用,在适当的地方引入即可,在
Nuxt3中,可以在各个布局文件中引入。
Confirm.open如下代码,使用方法类似于 Element 中的 ElMessageBox.confirm:
ts// 打开确认框
Confirm.open({
    title: "提示", // 确认框标题
    content: "确定要删除吗?", // 确认框内容
    confirm: () => {
      openConfirm(); // 确定按钮回调事件
    },
    // cancel 函数可以自定义,也可以省略
    // close 函数暂时没用到,所以没封装,传入也没用
});
由于本人水平有限,不太会封装插件,因此采用这样简单的封装方式,本着能用就行的原则,暂时够用了,如果你的能力高超,完全可以将其拓展、封装成功能能全面的插件,感谢阅读~
本文作者:DingDangDog
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!