Modal 对话框 #

概述 #

Modal 对话框用于在当前页面弹出一个对话框,承载相关操作或信息展示。

基础用法 #

基本对话框 #

tsx
import { Modal, Button } from 'antd';
import { useState } from 'react';

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

<Button type="primary" onClick={() => setOpen(true)}>
  打开对话框
</Button>

<Modal
  title="对话框标题"
  open={open}
  onOk={() => setOpen(false)}
  onCancel={() => setOpen(false)}
>
  <p>对话框内容</p>
  <p>对话框内容</p>
  <p>对话框内容</p>
</Modal>

异步关闭 #

tsx
import { Modal, Button } from 'antd';
import { useState } from 'react';

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

const handleOk = async () => {
  setConfirmLoading(true);
  try {
    await submitData();
    setOpen(false);
  } finally {
    setConfirmLoading(false);
  }
};

<Modal
  title="对话框标题"
  open={open}
  confirmLoading={confirmLoading}
  onOk={handleOk}
  onCancel={() => setOpen(false)}
>
  <p>对话框内容</p>
</Modal>

确认对话框 #

tsx
import { Modal, Button } from 'antd';

const showConfirm = () => {
  Modal.confirm({
    title: '确定要删除吗?',
    content: '删除后数据将无法恢复',
    okText: '确定',
    cancelText: '取消',
    onOk() {
      return new Promise((resolve) => {
        setTimeout(resolve, 1000);
      });
    },
    onCancel() {},
  });
};

<Button onClick={showConfirm}>确认对话框</Button>

信息提示 #

tsx
import { Modal, Button, Space } from 'antd';

<Space>
  <Button onClick={() => Modal.info({ title: '信息提示', content: '内容' })}>
    信息
  </Button>
  <Button onClick={() => Modal.success({ title: '成功提示', content: '内容' })}>
    成功
  </Button>
  <Button onClick={() => Modal.error({ title: '错误提示', content: '内容' })}>
    错误
  </Button>
  <Button onClick={() => Modal.warning({ title: '警告提示', content: '内容' })}>
    警告
  </Button>
</Space>

对话框尺寸 #

tsx
import { Modal, Button, Space } from 'antd';

<Space>
  <Button onClick={() => setModalWidth(600)}>600px</Button>
  <Button onClick={() => setModalWidth(1000)}>1000px</Button>
  <Button onClick={() => setModalWidth('90%')}>90%</Button>
</Space>

<Modal
  title="对话框标题"
  open={open}
  width={modalWidth}
  onOk={() => setOpen(false)}
  onCancel={() => setOpen(false)}
>
  <p>对话框内容</p>
</Modal>

全屏对话框 #

tsx
import { Modal, Button } from 'antd';

<Modal
  title="全屏对话框"
  open={open}
  width="100%"
  style={{ top: 0 }}
  onOk={() => setOpen(false)}
  onCancel={() => setOpen(false)}
>
  <p>对话框内容</p>
</Modal>

居中对话框 #

tsx
import { Modal, Button } from 'antd';

<Modal
  title="居中对话框"
  centered
  open={open}
  onOk={() => setOpen(false)}
  onCancel={() => setOpen(false)}
>
  <p>对话框内容</p>
</Modal>

自定义页脚 #

tsx
import { Modal, Button } from 'antd';

<Modal
  title="自定义页脚"
  open={open}
  footer={[
    <Button key="back" onClick={() => setOpen(false)}>
      取消
    </Button>,
    <Button key="submit" type="primary" onClick={() => setOpen(false)}>
      提交
    </Button>,
  ]}
>
  <p>对话框内容</p>
</Modal>

无页脚 #

tsx
import { Modal, Button } from 'antd';

<Modal
  title="无页脚对话框"
  open={open}
  footer={null}
  onCancel={() => setOpen(false)}
>
  <p>对话框内容</p>
</Modal>

表单对话框 #

tsx
import { Modal, Form, Input, Button } from 'antd';

const [form] = Form.useForm();

const handleOk = async () => {
  try {
    const values = await form.validateFields();
    console.log('表单数据:', values);
    setOpen(false);
  } catch (error) {
    console.error('验证失败:', error);
  }
};

<Modal
  title="表单对话框"
  open={open}
  onOk={handleOk}
  onCancel={() => setOpen(false)}
  destroyOnClose
>
  <Form form={form} layout="vertical">
    <Form.Item name="name" label="姓名" rules={[{ required: true }]}>
      <Input />
    </Form.Item>
    <Form.Item name="email" label="邮箱" rules={[{ required: true, type: 'email' }]}>
      <Input />
    </Form.Item>
  </Form>
</Modal>

API #

属性 说明 类型 默认值
afterClose 关闭后回调 function -
bodyStyle 内容区域样式 CSSProperties -
cancelButtonProps 取消按钮属性 ButtonProps -
cancelText 取消按钮文字 ReactNode 取消
centered 垂直居中 boolean false
closable 是否显示关闭按钮 boolean true
closeIcon 自定义关闭图标 ReactNode -
confirmLoading 确认按钮加载 boolean false
destroyOnClose 关闭时销毁 boolean false
focusTriggerAfterClose 关闭后聚焦触发元素 boolean true
footer 底部内容 ReactNode 确定取消按钮
forceRender 强制渲染 boolean false
getContainer 指定挂载容器 HTMLElement | () => HTMLElement | false document.body
keyboard ESC 关闭 boolean true
mask 是否展示遮罩 boolean true
maskClosable 点击遮罩关闭 boolean true
maskStyle 遮罩样式 CSSProperties -
modalRender 自定义渲染 (node: ReactNode) => ReactNode -
okButtonProps 确认按钮属性 ButtonProps -
okText 确认按钮文字 ReactNode 确定
okType 确认按钮类型 string primary
style 对话框样式 CSSProperties -
title 标题 ReactNode -
title 标题 ReactNode -
open 是否显示 boolean -
width 宽度 string | number 520
wrapClassName 包裹类名 string -
zIndex z-index number 1000
onCancel 取消回调 function(e) -
onOk 确认回调 function(e) -

Modal.method() #

方法 说明
Modal.info 信息对话框
Modal.success 成功对话框
Modal.error 错误对话框
Modal.warning 警告对话框
Modal.confirm 确认对话框
Modal.destroyAll 销毁所有对话框

Modal.method() 参数 #

属性 说明 类型 默认值
autoFocusButton 自动聚焦按钮 ok | cancel | null ok
cancelButtonProps 取消按钮属性 ButtonProps -
cancelText 取消按钮文字 string 取消
centered 垂直居中 boolean false
className 对话框类名 string -
closable 是否显示关闭按钮 boolean false
closeIcon 自定义关闭图标 ReactNode -
content 内容 ReactNode -
icon 图标 ReactNode -
keyboard ESC 关闭 boolean true
mask 是否展示遮罩 boolean true
maskClosable 点击遮罩关闭 boolean false
okButtonProps 确认按钮属性 ButtonProps -
okText 确认按钮文字 string 确定
okType 确认按钮类型 string primary
title 标题 ReactNode -
width 宽度 string | number 416
onCancel 取消回调 function -
onOk 确认回调 function -

最佳实践 #

1. 使用 hooks #

tsx
import { Modal } from 'antd';

const [modal, contextHolder] = Modal.useModal();

const showConfirm = () => {
  modal.confirm({
    title: '确定删除吗?',
    content: '此操作不可恢复',
    onOk: handleDelete,
  });
};

return (
  <>
    <Button onClick={showConfirm}>删除</Button>
    {contextHolder}
  </>
);

2. 表单对话框 #

tsx
import { Modal, Form, Input } from 'antd';

const UserModal = ({ open, onClose, onSubmit }) => {
  const [form] = Form.useForm();

  const handleOk = async () => {
    const values = await form.validateFields();
    onSubmit(values);
    form.resetFields();
  };

  return (
    <Modal
      title="用户信息"
      open={open}
      onOk={handleOk}
      onCancel={onClose}
      destroyOnClose
    >
      <Form form={form} preserve={false}>
        <Form.Item name="name" label="姓名" rules={[{ required: true }]}>
          <Input />
        </Form.Item>
      </Form>
    </Modal>
  );
};

3. 异步确认 #

tsx
import { Modal } from 'antd';

Modal.confirm({
  title: '确定提交吗?',
  content: '提交后将无法修改',
  onOk: async () => {
    await submitData();
    message.success('提交成功');
  },
});

下一步 #

接下来学习 Notification 通知 组件!

最后更新:2026-03-28