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 #
Modal #
| 属性 | 说明 | 类型 | 默认值 |
|---|---|---|---|
| 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