vue-pure-admin确认对话框:Confirm删除确认与操作确认

vue-pure-admin确认对话框:Confirm删除确认与操作确认

【免费下载链接】vue-pure-admin 全面ESM+Vue3+Vite+Element-Plus+TypeScript编写的一款后台管理系统(兼容移动端) 【免费下载链接】vue-pure-admin 项目地址: https://gitcode.com/GitHub_Trending/vu/vue-pure-admin

还在为业务系统中的删除操作提心吊胆?vue-pure-admin的ReDialog组件提供了完整的确认对话框解决方案,让危险操作不再"误伤"!

🎯 读完本文你将掌握

  • ✅ ReDialog确认对话框的核心功能与优势
  • ✅ 5种不同场景的删除确认实现方案
  • ✅ 操作确认的最佳实践与防误触策略
  • ✅ 高级功能:二次确认、防抖处理、状态管理
  • ✅ 完整代码示例与实战应用场景

🔍 为什么需要确认对话框?

在企业管理系统中,删除操作往往是不可逆的。一个误操作可能导致:

  • 数据永久丢失:用户信息、订单记录等重要数据
  • 业务中断:系统配置、权限设置等关键信息
  • 操作风险:财务数据、审计日志等敏感内容

vue-pure-admin的ReDialog组件提供了专业的确认机制,有效防止误操作带来的损失。

🏗️ ReDialog组件架构解析

mermaid

🚀 5种确认对话框实现方案

方案一:基础删除确认(推荐)

function confirmDelete(item: any) {
  addDialog({
    title: "确认删除",
    width: "400px",
    contentRenderer: () => (
      <div class="p-4">
        <p class="text-gray-600 mb-4">
          确定要删除【{item.name}】吗?此操作不可恢复!
        </p>
      </div>
    ),
    popconfirm: {
      title: "请再次确认删除操作",
      confirmButtonText: "确认删除",
      cancelButtonText: "再想想"
    },
    beforeSure: (done, { options, index }) => {
      // 调用删除API
      deleteItem(item.id).then(() => {
        message.success("删除成功");
        done(); // 关闭对话框
      }).catch(error => {
        message.error("删除失败");
      });
    }
  });
}

方案二:批量删除确认

function confirmBatchDelete(selectedItems: any[]) {
  if (selectedItems.length === 0) {
    message.warning("请先选择要删除的项目");
    return;
  }

  addDialog({
    title: "批量删除确认",
    width: "500px",
    contentRenderer: () => (
      <div class="p-4">
        <el-alert
          title="危险操作"
          type="warning"
          description={`您选择了 ${selectedItems.length} 个项目进行删除`}
          show-icon
          class="mb-4"
        />
        <el-scrollbar max-height="200px">
          {selectedItems.map(item => (
            <div key={item.id} class="flex items-center py-2 border-b">
              <span class="flex-1">{item.name}</span>
              <el-tag size="small">{item.type}</el-tag>
            </div>
          ))}
        </el-scrollbar>
      </div>
    ),
    beforeSure: (done, { closeLoading }) => {
      batchDelete(selectedItems.map(i => i.id))
        .then(() => {
          message.success(`成功删除 ${selectedItems.length} 个项目`);
          done();
        })
        .catch(() => {
          closeLoading(); // 仅关闭loading,不关闭对话框
          message.error("删除失败,请重试");
        });
    }
  });
}

方案三:带输入验证的敏感操作确认

function confirmDangerousOperation() {
  const inputText = ref("");
  
  addDialog({
    title: "敏感操作确认",
    width: "450px",
    contentRenderer: () => (
      <div class="p-4">
        <el-alert
          title="此操作影响系统稳定性"
          type="error"
          description="请谨慎操作,确认您了解此操作的风险"
          show-icon
          class="mb-4"
        />
        <p class="text-gray-600 mb-2">
          请输入"CONFIRM"以确认操作:
        </p>
        <el-input
          v-model={inputText.value}
          placeholder="请输入CONFIRM"
          class="mb-4"
        />
      </div>
    ),
    beforeSure: (done, { closeLoading }) => {
      if (inputText.value !== "CONFIRM") {
        message.error("验证文本输入错误");
        closeLoading();
        return;
      }
      
      executeDangerousOperation()
        .then(() => {
          message.success("操作执行成功");
          done();
        })
        .catch(error => {
          closeLoading();
          message.error("操作执行失败");
        });
    }
  });
}

方案四:异步操作确认带Loading状态

function confirmAsyncOperation() {
  addDialog({
    title: "执行异步操作",
    sureBtnLoading: true, // 启用确定按钮loading
    width: "400px",
    contentRenderer: () => (
      <div class="p-4">
        <p class="text-gray-600">
          此操作可能需要较长时间,是否继续?
        </p>
      </div>
    ),
    beforeSure: (done, { closeLoading }) => {
      // 模拟异步操作
      setTimeout(() => {
        done(); // 完成后关闭对话框
        message.success("操作完成");
      }, 2000);
    }
  });
}

方案五:嵌套确认(重要操作二次确认)

function confirmImportantOperation() {
  let confirmed = false;
  
  addDialog({
    title: "重要操作确认",
    width: "400px",
    contentRenderer: () => (
      <div class="p-4">
        <el-alert
          title="重要提示"
          type="warning"
          description="此操作将影响系统核心功能"
          show-icon
          class="mb-4"
        />
        <el-checkbox v-model={confirmed}>
          我已了解此操作的风险并确认执行
        </el-checkbox>
      </div>
    ),
    beforeSure: (done, { closeLoading }) => {
      if (!confirmed) {
        message.warning("请先确认了解操作风险");
        closeLoading();
        return;
      }
      
      // 二次确认弹窗
      addDialog({
        title: "最终确认",
        width: "350px",
        contentRenderer: () => (
          <p class="p-4 text-red-500">确定要执行此重要操作吗?</p>
        ),
        beforeSure: (innerDone) => {
          executeImportantOperation()
            .then(() => {
              message.success("操作成功");
              innerDone();
              done();
            })
            .catch(() => {
              closeLoading();
              message.error("操作失败");
            });
        }
      });
    }
  });
}

📊 确认对话框类型对比

类型适用场景特点复杂度
基础确认简单删除操作单次确认,快速简单
批量确认多项目删除显示选中项列表,批量处理⭐⭐
输入验证高风险操作需要输入特定文本确认⭐⭐⭐
异步确认耗时操作显示loading状态,防止重复提交⭐⭐
嵌套确认极高风险操作二次确认,最大限度防止误操作⭐⭐⭐⭐

🛡️ 防误触最佳实践

1. 防抖处理(Debounce)

import { debounce } from "@pureadmin/utils";

const confirmDelete = debounce((item) => {
  addDialog({
    // 对话框配置
  });
}, 300);

2. 操作日志记录

beforeSure: (done, { options, index }) => {
  // 记录操作日志
  logOperation({
    type: 'DELETE',
    target: item.name,
    operator: currentUser.name,
    timestamp: new Date()
  });
  
  deleteItem(item.id).then(done);
}

3. 权限验证

function confirmDeleteWithPermission(item) {
  if (!hasPermission('delete')) {
    message.error("无删除权限");
    return;
  }
  
  addDialog({
    // 对话框配置
  });
}

🔧 高级配置选项

自定义按钮文本

addDialog({
  title: "自定义确认",
  footerButtons: [
    {
      label: "放弃",
      type: "info",
      btnClick: ({ dialog: { options, index } }) => {
        closeDialog(options, index);
      }
    },
    {
      label: "狠心删除",
      type: "danger",
      popconfirm: {
        title: "最后确认?",
        confirmButtonText: "确定删除",
        cancelButtonText: "再想想"
      },
      btnClick: ({ dialog: { options, index } }) => {
        // 删除逻辑
      }
    }
  ]
});

动态标题和内容

function dynamicConfirm(item, actionType) {
  const titles = {
    delete: "删除确认",
    disable: "禁用确认", 
    enable: "启用确认"
  };
  
  const messages = {
    delete: `确定要删除【${item.name}】吗?`,
    disable: `确定要禁用【${item.name}】吗?`,
    enable: `确定要启用【${item.name}】吗?`
  };
  
  addDialog({
    title: titles[actionType],
    contentRenderer: () => <p>{messages[actionType]}</p>
  });
}

🎯 实战应用场景

场景1:用户管理删除确认

function confirmUserDelete(user) {
  addDialog({
    title: "删除用户",
    width: "450px",
    contentRenderer: () => (
      <div class="p-4">
        <el-alert
          title="注意"
          type="warning"
          description="删除用户将同时删除其所有相关数据"
          show-icon
          class="mb-4"
        />
        <div class="bg-gray-50 p-3 rounded">
          <p><strong>用户名:</strong>{user.username}</p>
          <p><strong>邮箱:</strong>{user.email}</p>
          <p><strong>角色:</strong>{user.roles.join(', ')}</p>
        </div>
      </div>
    ),
    popconfirm: {
      title: "此操作不可恢复,确认删除?",
      confirmButtonType: "danger"
    }
  });
}

场景2:数据导出确认

function confirmExport(data) {
  addDialog({
    title: "数据导出",
    width: "400px",
    contentRenderer: () => (
      <div class="p-4">
        <p>即将导出 {data.length} 条记录</p>
        <el-checkbox class="mt-3">包含敏感信息</el-checkbox>
      </div>
    ),
    beforeSure: (done) => {
      exportData(data).then(done);
    }
  });
}

📝 总结与最佳实践

  1. 风险分级:根据操作风险程度选择合适的确认方案
  2. 用户体验:在安全性和便捷性之间找到平衡点
  3. 日志记录:重要操作务必记录操作日志
  4. 权限控制:结合权限系统进行访问控制
  5. 错误处理:完善的错误处理和用户反馈机制

vue-pure-admin的ReDialog组件为开发者提供了强大而灵活的确认对话框解决方案,通过合理的配置和使用,可以显著提升系统的安全性和用户体验。

安全无小事,确认对话框虽小,却是守护系统安全的重要防线。合理运用本文介绍的方案,让你的应用更加健壮可靠!

【免费下载链接】vue-pure-admin 全面ESM+Vue3+Vite+Element-Plus+TypeScript编写的一款后台管理系统(兼容移动端) 【免费下载链接】vue-pure-admin 项目地址: https://gitcode.com/GitHub_Trending/vu/vue-pure-admin

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值