基于 ElementPlus 二次封装的 删除组件

基于 elementPlus 二次封装的 删除组件

<template>
  <div v-if="deleteVisible">
    <!-- 删除弹窗 -->
    <el-dialog
      :model-value="deleteVisible"
      title="提示"
      width="500"
      :close-on-click-modal="false"
      :before-close="deleteClose"
    >
      <div style="display: flex; align-items: center">
        <el-icon style="width: 25px"><WarningFilled style="color: #e6a23d; width: 50px; height: 20px" /></el-icon>
        {{ deleteContent }}
        <span style="font-weight: 600">{{ deleteContentTitle }}</span>吗?
      </div>
      <template #footer>
        <div class="dialog-footer">
          <el-button :loading="isLoading" type="primary" @click="deleteOk"> 
             {{ submitTitle }}
          </el-button>
          <el-button :loading="isLoading" type="shape" class="close" @click="deleteClose">
            {{ closeTitle }}
          </el-button>
          
        </div>
      </template>
    </el-dialog>
  </div>
</template>
<script setup lang="ts">
import { ref, withDefaults } from "vue";
import { WarningFilled } from "@element-plus/icons-vue";
import { ElIcon, ElDialog, ElButton } from "element-plus";

/**
 * 删除确认对话框组件
 *
 * @displayName DeleteConfirmDialog 删除确认对话框
 * @version 1.0.0
 *
 * @example 基本用法
 * <DeleteConfirmDialog
 *   v-model:deleteVisible="showDialog"
 *   deleteContentTitle="用户数据"
 *   :deleteApi="deleteUserApi"
 *   :deleteId="selectedUserId"
 *   @confirm="handleDeleteSuccess"
 * />
 */
interface Props {
  /**
   * 对话框标题
   * @default "提示"
   */
  title?: string;

  /**
   * 控制对话框显示/隐藏
   * @model
   * @required
   */
  deleteVisible: boolean;

  /**
   * 要删除的项目ID
   * @required
   */
  deleteId: string | number;

  /**
   * 删除确认内容前缀
   * @default "确认要删除"
   */
  deleteContent?: string;

  /**
   * 要删除的项目名称
   * @default "名称"
   */
  deleteContentTitle?: string;

  /**
   * 确认按钮文字
   * @default "确认"
   */
  submitTitle?: string;

  /**
   * 取消按钮文字
   * @default "取消"
   */
  closeTitle?: string;

  /**
   * 删除API函数
   * @type {function}
   * @param {Object} params - 参数对象
   * @param {string|number} params.id - 删除项ID
   * @returns {Promise} 返回Promise
   * @required
   */
  deleteApi: (params: { id: string | number }) => Promise<any>;
}

const props = withDefaults(defineProps<Props>(), {
  title: "提示",
  deleteContent: "确认要删除",
  deleteContentTitle: "名称",
  submitTitle: "确认",
  closeTitle: "取消",
});

/**
 * @event {function} update:deleteVisible - 对话框关闭时触发 (用于v-model同步)
 * @event {function} close - 用户点击取消或关闭按钮时触发
 * @event {function} confirm - 用户点击确认按钮时触发
 * @returns
 */
const $emit = defineEmits(["update:deleteVisible", "close", "confirm"]);

/**
 * 按钮的加载状态
 */
const isLoading = ref<boolean>(false);

/**
 * 处理确认删除操作
 * @async
 * @description 调用删除API并在成功后触发confirm事件
 * @returns {Promise<void>}
 */
const deleteOk = async () => {
  isLoading.value = true;
  try {
    const data = await props.deleteApi({ id: props.deleteId });
    $emit("confirm");
    $emit("update:deleteVisible", false);
  } catch (error) {
    console.log("error ::>>", error);
  } finally {
    isLoading.value = false;
  }
};

/**
 * 处理对话框关闭操作
 * @description 触发关闭事件并重置加载状态
 */
const deleteClose = () => {
  $emit("update:deleteVisible", false);
  $emit("close");
  isLoading.value = false;
};
</script>
<style lang="scss" scoped>
:deep(.el-dialog__title) {
  font-weight: 500;
}
.close {
  margin-left: 20px;
}
</style>

使用

 <DeleteTip
    :delete-api="deleteAPI"
    :delete-content="'确认删除策略'"
    :delete-content-title="策略名称"
    :delete-id="1"
    v-model:delete-visible="deleteVisible"
    @confirm="submitDelete"
  />
// ------------------------------------------- delete dialog start ------------------------------------------------

//  删除 开关
const deleteVisible = ref<boolean>(false);

// 删除的行内容
const deleteContent = ref<any>("");

// 确认删除
const submitDelete = () => {
  ElMessage.success("已删除");
  deleteClose();
};
// 取消删除
const deleteClose = () => {
  deleteVisible.value = false;
  deleteContent.value = "";
};
// ------------------------------------------- delete dialog end ------------------------------------------------


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值