Prompts-MCP 686 skills · ai / design / design-pattern / framework / fundamentals / habit / lang / tech-selection /mcp/sse
framework framework/antd/modal/confirm-vs-modal.md medium

antd-confirm-vs-modal

Modal.confirm 用于一次性确认 / <Modal> 用于复杂内容。Use when 写 React 组件 / 改 .tsx 文件 / 评审涉及 `confirm-vs-modal` 的 PR。

modalmodal.confirmdrawer用于一次于一次性一次性确
paths
  • frontend/src/**/*.tsx

antd · Modal.confirm vs <Modal>

规则

场景
一次性确认对话(删除 / 退出 / 重置) modal.confirm()
含表单 / 复杂内容 / 多步骤 <Modal> 受控组件
异步等待用户操作返回 boolean modal.confirm()(返回 Promise)

Modal.confirm(推荐用于简单确认)

import { App } from "antd";

function DeleteButton({ id }: { id: string }) {
  const { modal } = App.useApp();   // 必须在 <App> 内才能用

  const handleDelete = () => {
    modal.confirm({
      title: "确认删除?",
      content: "删除后不可恢复",
      okText: "删除",
      okType: "danger",
      cancelText: "取消",
      onOk: async () => {
        await presentationsApi.delete(id);
        message.success("已删除");
      },
    });
  };

  return <Button danger onClick={handleDelete}>删除</Button>;
}

返回 PromiseonOkasync,按"确定"会等待 Promise,期间按钮 loading。

<Modal> 受控(复杂场景)

const [open, setOpen] = useState(false);

<Modal
  title="编辑课件"
  open={open}
  onCancel={() => setOpen(false)}
  onOk={handleSave}
  okText="保存"
  cancelText="取消"
  width={680}
  destroyOnClose          // 关闭时卸载释放内存
  maskClosable={false}    // 不允许点遮罩关
>
  <Form>...</Form>
</Modal>

反例

// ❌ 直接用 import 的 Modal.confirm(脱离 ConfigProvider context)
import { Modal } from "antd";
Modal.confirm({ ... });   // 主题可能丢失,控制台警告

// ✅ 用 App.useApp() 拿
const { modal } = App.useApp();
modal.confirm({ ... });

destroyOnClose 何时用

<Modal destroyOnClose>...</Modal>
何时开 何时关
内容含表单(重新打开应重置) 内容是纯展示(保留状态)
内容含大量数据 / 图片 同上
内容含 useEffect 订阅

详见 lazy-mount.md

自检

  • [ ] 简单确认用 modal.confirm()?
  • [ ] 复杂内容用 <Modal>?
  • [ ] confirm 的 onOk 用 async(按钮自动 loading)?
  • [ ] 通过 App.useApp() 拿 modal,不直接 import Modal.confirm?

相关