logoAnt Design

⌘ K
  • 设计
  • 研发
  • 组件
  • 博客
  • 资源
  • 国内镜像
5.25.1
  • 组件总览
  • 通用
    • Button按钮
    • FloatButton悬浮按钮
      5.0.0
    • Icon图标
    • Typography排版
  • 布局
    • Divider分割线
    • Flex弹性布局
      5.10.0
    • Grid栅格
    • Layout布局
    • Space间距
    • Splitter分隔面板
      5.21.0
  • 导航
    • Anchor锚点
    • Breadcrumb面包屑
    • Dropdown下拉菜单
    • Menu导航菜单
    • Pagination分页
    • Steps步骤条
    • Tabs标签页
  • 数据录入
    • AutoComplete自动完成
    • Cascader级联选择
    • Checkbox多选框
    • ColorPicker颜色选择器
      5.5.0
    • DatePicker日期选择框
    • Form表单
    • Input输入框
    • InputNumber数字输入框
    • Mentions提及
    • Radio单选框
    • Rate评分
    • Select选择器
    • Slider滑动输入条
    • Switch开关
    • TimePicker时间选择框
    • Transfer穿梭框
    • TreeSelect树选择
    • Upload上传
  • 数据展示
    • Avatar头像
    • Badge徽标数
    • Calendar日历
    • Card卡片
    • Carousel走马灯
    • Collapse折叠面板
    • Descriptions描述列表
    • Empty空状态
    • Image图片
    • List列表
    • Popover气泡卡片
    • QRCode二维码
      5.1.0
    • Segmented分段控制器
    • Statistic统计数值
    • Table表格
    • Tag标签
    • Timeline时间轴
    • Tooltip文字提示
    • Tour漫游式引导
      5.0.0
    • Tree树形控件
  • 反馈
    • Alert警告提示
    • Drawer抽屉
    • Message全局提示
    • Modal对话框
    • Notification通知提醒框
    • Popconfirm气泡确认框
    • Progress进度条
    • Result结果
    • Skeleton骨架屏
    • Spin加载中
    • Watermark水印
      5.1.0
  • 其他
    • Affix固钉
    • App包裹组件
      5.1.0
    • ConfigProvider全局化配置
    • Util工具类
      5.13.0

Modal
对话框

展示一个对话框,提供标题、内容区、操作区。
使用import { Modal } from "antd";
源码components/modal
文档
编辑此页更新日志

相关资源

Ant Design X
Ant Design Charts
Ant Design Pro
Pro Components
Ant Design Mobile
Ant Design Mini
Ant Design Web3
Ant Design Landing-首页模板集
Scaffolds-脚手架市场
Umi-React 应用开发框架
dumi-组件/文档研发工具
qiankun-微前端框架
Ant Motion-设计动效
国内镜像站点 🇨🇳

社区

Awesome Ant Design
Medium
Twitter
yuque logoAnt Design 语雀专栏
Ant Design 知乎专栏
体验科技专栏
seeconf logoSEE Conf-蚂蚁体验科技大会
加入我们

帮助

GitHub
更新日志
常见问题
报告 Bug
议题
讨论区
StackOverflow
SegmentFault

Ant XTech logo更多产品

yuque logo语雀-构建你的数字花园
AntV logoAntV-数据可视化解决方案
Egg logoEgg-企业级 Node.js 框架
Kitchen logoKitchen-Sketch 工具集
Galacean logoGalacean-互动图形解决方案
xtech logo蚂蚁体验科技
主题编辑器
Made with ❤ by
蚂蚁集团和 Ant Design 开源社区
loading

何时使用

需要用户处理事务,又不希望跳转页面以致打断工作流程时,可以使用 Modal 在当前页面正中打开一个浮层,承载相应的操作。

另外当需要一个简洁的确认框询问用户时,可以使用 App.useApp 封装的语法糖方法。

代码演示

基本

基础弹框。

CodeSandbox Icon
codepen icon
External Link Icon
expand codeexpand code
自定义页脚

更复杂的例子,自定义了页脚的按钮,点击提交后进入 loading 状态,完成后关闭。

不需要默认确定取消按钮时,你可以把 footer 设为 null。

CodeSandbox Icon
codepen icon
External Link Icon
expand codeexpand code
自定义页脚渲染函数

自定义页脚渲染函数,支持在原有基础上进行扩展。

CodeSandbox Icon
codepen icon
External Link Icon
expand codeexpand code
5.9.0
国际化

设置 okText 与 cancelText 以自定义按钮文字。

CodeSandbox Icon
codepen icon
External Link Icon
expand codeexpand code


自定义位置

使用 centered 或类似 style.top 的样式来设置对话框位置。

CodeSandbox Icon
codepen icon
External Link Icon
expand codeexpand code
自定义渲染对话框

自定义渲染对话框, 可通过 react-draggable 来实现拖拽。

CodeSandbox Icon
codepen icon
External Link Icon
expand codeexpand code
静态方法

在绝大多数场景,都不需要静态方法。它无法消费 context,例如无法响应动态主题。请优先使用 hooks 版本或者 App 组件提供的 Modal 实例。

CodeSandbox Icon
codepen icon
External Link Icon
expand codeexpand code
自定义内部模块 className

通过 classNames 属性设置弹窗内部区域(header、body、footer、mask、wrapper)的 className。

CodeSandbox Icon
codepen icon
External Link Icon
expand codeexpand code
异步关闭

点击确定后异步关闭对话框,例如提交表单。

CodeSandbox Icon
codepen icon
External Link Icon
expand codeexpand code
加载中

设置对话框加载状态。

CodeSandbox Icon
codepen icon
External Link Icon
expand codeexpand code
5.18.0
使用 hooks 获得上下文

通过 Modal.useModal 创建支持读取 context 的 contextHolder。其中仅有 hooks 方法支持 Promise await 操作。

CodeSandbox Icon
codepen icon
External Link Icon
expand codeexpand code
手动更新和移除

通过返回的 instance 手动更新和关闭对话框。

CodeSandbox Icon
codepen icon
External Link Icon
expand codeexpand code
自定义页脚按钮属性

传入 okButtonProps 和 cancelButtonProps 可分别自定义确定按钮和取消按钮的 props。

CodeSandbox Icon
codepen icon
External Link Icon
expand codeexpand code
自定义模态的宽度

使用 width 来设置模态对话框的宽度。

CodeSandbox Icon
codepen icon
External Link Icon
expand codeexpand code
静态确认对话框

使用 confirm() 可以快捷地弹出确认框。onCancel/onOk 返回 promise 可以延迟关闭。

CodeSandbox Icon
codepen icon
External Link Icon
expand codeexpand code
销毁确认对话框

使用 Modal.destroyAll() 可以销毁弹出的确认窗。通常用于路由监听当中,处理路由前进、后退不能销毁确认对话框的问题。

CodeSandbox Icon
codepen icon
External Link Icon
expand codeexpand code

API

通用属性参考:通用属性

参数说明类型默认值版本
afterCloseModal 完全关闭后的回调function-
classNames配置弹窗内置模块的 classNameRecord<SemanticDOM, string>-
styles配置弹窗内置模块的 styleRecord<SemanticDOM, CSSProperties>-5.10.0
cancelButtonPropscancel 按钮 propsButtonProps-
cancelText取消按钮文字ReactNode取消
centered垂直居中展示 Modalbooleanfalse
closable是否显示右上角的关闭按钮boolean | { closeIcon?: React.ReactNode; disabled?: boolean; }true
closeIcon自定义关闭图标。5.7.0:设置为 null 或 false 时隐藏关闭按钮ReactNode<CloseOutlined />
confirmLoading确定按钮 loadingbooleanfalse
destroyOnClose关闭时销毁 Modal 里的子元素booleanfalse
destroyOnHidden关闭时销毁 Modal 里的子元素booleanfalse5.25.0
focusTriggerAfterClose对话框关闭后是否需要聚焦触发元素booleantrue4.9.0
footer底部内容,当不需要默认底部按钮时,可以设为 footer={null}ReactNode | (originNode: ReactNode, extra: { OkBtn: React.FC, CancelBtn: React.FC }) => ReactNode(确定取消按钮)renderFunction: 5.9.0
forceRender强制渲染 Modalbooleanfalse
getContainer指定 Modal 挂载的节点,但依旧为全屏展示,false 为挂载在当前位置HTMLElement | () => HTMLElement | Selectors | falsedocument.body
keyboard是否支持键盘 esc 关闭booleantrue
mask是否展示遮罩booleantrue
maskClosable点击蒙层是否允许关闭booleantrue
modalRender自定义渲染对话框(node: ReactNode) => ReactNode-4.7.0
okButtonPropsok 按钮 propsButtonProps-
okText确认按钮文字ReactNode确定
okType确认按钮类型stringprimary
style可用于设置浮层的样式,调整浮层位置等CSSProperties-
loading显示骨架屏boolean5.18.0
title标题ReactNode-
open对话框是否可见boolean-
width宽度string | number | Breakpoint520Breakpoint: 5.23.0
wrapClassName对话框外层容器的类名string-
zIndex设置 Modal 的 z-indexnumber1000
onCancel点击遮罩层或右上角叉或取消按钮的回调function(e)-
onOk点击确定回调function(e)-
afterOpenChange打开和关闭 Modal 时动画结束后的回调(open: boolean) => void-5.4.0

注意

  • <Modal /> 默认关闭后状态不会自动清空,如果希望每次打开都是新内容,请设置 destroyOnHidden。
  • <Modal /> 和 Form 一起配合使用时,设置 destroyOnHidden 也不会在 Modal 关闭时销毁表单字段数据,需要设置 <Form preserve={false} />。
  • Modal.method() RTL 模式仅支持 hooks 用法。

Modal.method()

包括:

  • Modal.info
  • Modal.success
  • Modal.error
  • Modal.warning
  • Modal.confirm

以上均为一个函数,参数为 object,具体属性如下:

参数说明类型默认值版本
afterCloseModal 完全关闭后的回调function-4.9.0
autoFocusButton指定自动获得焦点的按钮null | ok | cancelok
cancelButtonPropscancel 按钮 propsButtonProps-
cancelText设置 Modal.confirm 取消按钮文字string取消
centered垂直居中展示 Modalbooleanfalse
className容器类名string-
closable是否显示右上角的关闭按钮booleanfalse4.9.0
closeIcon自定义关闭图标ReactNodeundefined4.9.0
content内容ReactNode-
footer底部内容,当不需要默认底部按钮时,可以设为 footer: nullReactNode | (originNode: ReactNode, extra: { OkBtn: React.FC, CancelBtn: React.FC }) => ReactNode-renderFunction: 5.9.0
getContainer指定 Modal 挂载的 HTML 节点,false 为挂载在当前 domHTMLElement | () => HTMLElement | Selectors | falsedocument.body
icon自定义图标ReactNode<ExclamationCircleFilled />
keyboard是否支持键盘 esc 关闭booleantrue
mask是否展示遮罩booleantrue
maskClosable点击蒙层是否允许关闭booleanfalse
okButtonPropsok 按钮 propsButtonProps-
okText确认按钮文字string确定
okType确认按钮类型stringprimary
style可用于设置浮层的样式,调整浮层位置等CSSProperties-
title标题ReactNode-
width宽度string | number416
wrapClassName对话框外层容器的类名string-4.18.0
zIndex设置 Modal 的 z-indexnumber1000
onCancel点击取消回调,参数为关闭函数,若返回 promise 时 resolve 为正常关闭, reject 为不关闭function(close)-
onOk点击确定回调,参数为关闭函数,若返回 promise 时 resolve 为正常关闭, reject 为不关闭function(close)-

以上函数调用后,会返回一个引用,可以通过该引用更新和关闭弹窗。

jsx
const modal = Modal.info();
modal.update({
title: '修改的标题',
content: '修改的内容',
});
// 在 4.8.0 或更高版本中,可以通过传入函数的方式更新弹窗
modal.update((prevConfig) => ({
...prevConfig,
title: `${prevConfig.title}(新)`,
}));
modal.destroy();
  • Modal.destroyAll

使用 Modal.destroyAll() 可以销毁弹出的确认窗(即上述的 Modal.info、Modal.success、Modal.error、Modal.warning、Modal.confirm)。通常用于路由监听当中,处理路由前进、后退不能销毁确认对话框的问题,而不用各处去使用实例的返回值进行关闭(modal.destroy() 适用于主动关闭,而不是路由这样被动关闭)

jsx
import { browserHistory } from 'react-router';
// router change
browserHistory.listen(() => {
Modal.destroyAll();
});

Modal.useModal()

当你需要使用 Context 时,可以通过 Modal.useModal 创建一个 contextHolder 插入子节点中。通过 hooks 创建的临时 Modal 将会得到 contextHolder 所在位置的所有上下文。创建的 modal 对象拥有与 Modal.method 相同的创建通知方法。

jsx
const [modal, contextHolder] = Modal.useModal();
React.useEffect(() => {
modal.confirm({
// ...
});
}, []);
return <div>{contextHolder}</div>;

modal.confirm 返回方法:

  • destroy:销毁当前窗口
  • update:更新当前窗口
  • then:Promise 链式调用,支持 await 操作。该方法为 Hooks 仅有
tsx
//点击 `onOk` 时返回 `true`,点击 `onCancel` 时返回 `false`
const confirmed = await modal.confirm({ ... });

Semantic DOM

  • mask
    5.13.0
    遮罩层元素
  • content
    5.13.0
    Modal 容器元素
  • wrapper
    5.13.0
    包裹层元素,一般用于动画容器
  • header
    5.13.0
    头部元素
  • body
    5.13.0
    内容元素
  • footer
    5.13.0
    底部元素

主题变量(Design Token)

组件 Token如何定制?
Token 名称描述类型默认值
contentBg内容区域背景色string#ffffff
footerBg底部区域背景色stringtransparent
headerBg顶部背景色string#ffffff
titleColor标题字体颜色stringrgba(0,0,0,0.88)
titleFontSize标题字体大小number16
titleLineHeight标题行高string | number1.5
全局 Token如何定制?

FAQ

为什么 Modal 关闭时,内容不会更新?

Modal 在关闭时会将内容进行 memo 从而避免关闭过程中的内容跳跃。也因此如果你在配合使用 Form 有关闭时重置 initialValues 的操作,请通过在 effect 中调用 resetFields 来重置。

为什么 Modal 方法不能获取 context、redux、的内容和 ConfigProvider locale/prefixCls/theme 等配置?

直接调用 Modal 方法,antd 会通过 ReactDOM.render 动态创建新的 React 实体。其 context 与当前代码所在 context 并不相同,因而无法获取 context 信息。

当你需要 context 信息(例如 ConfigProvider 配置的内容)时,可以通过 Modal.useModal 方法会返回 modal 实体以及 contextHolder 节点。将其插入到你需要获取 context 位置即可:

tsx
const [modal, contextHolder] = Modal.useModal();
return (
<Context1.Provider value="Ant">
{/* contextHolder 在 Context1 内,它可以获得 Context1 的 context */}
{contextHolder}
<Context2.Provider value="Design">
{/* contextHolder 在 Context2 外,因而不会获得 Context2 的 context */}
</Context2.Provider>
</Context1.Provider>
);

异同:通过 hooks 创建的 contextHolder 必须插入到子元素节点中才会生效,当你不需要上下文信息时请直接调用。

可通过 App 包裹组件 简化 useModal 等方法需要手动植入 contextHolder 的问题。

静态方法如何设置 prefixCls ?

你可以通过 ConfigProvider.config 进行设置。