logoNamu Design

⌘ K
  • 设计
  • 研发
  • 组件
  • 博客
  • 资源
  • 国内镜像
1.0.0
  • 组件总览
  • 通用
    • Button按钮
    • FloatButton悬浮按钮New
    • Icon图标
    • Typography排版
  • 布局
    • Divider分割线
    • Grid栅格
    • Layout布局
    • Space间距
  • 导航
    • Anchor锚点
    • Breadcrumb面包屑
    • Dropdown下拉菜单
    • Menu导航菜单
    • Pagination分页
    • Steps步骤条
  • 数据录入
    • AutoComplete自动完成
    • Cascader级联选择
    • Checkbox多选框
    • ColorPicker颜色选择器New
    • 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二维码New
    • Segmented分段控制器
    • Statistic统计数值
    • Table表格
    • Tabs标签页
    • Tag标签
    • Timeline时间轴
    • Tooltip文字提示
    • Tour漫游式引导New
    • Tree树形控件
  • 反馈
    • Alert警告提示
    • Drawer抽屉
    • Message全局提示
    • Modal对话框
    • Notification通知提醒框
    • Popconfirm气泡确认框
    • Progress进度条
    • Result结果
    • Skeleton骨架屏
    • Spin加载中
    • Watermark水印New
  • 其他
    • Affix固钉
    • App包裹组件New
    • ConfigProvider全局化配置
何时使用
代码演示
基本
异步关闭
自定义页脚
使用 hooks 获得上下文
国际化
手动更新和移除
自定义位置
自定义页脚按钮属性
自定义渲染对话框
自定义模态的宽度
静态方法
静态确认对话框
销毁确认对话框
API
Modal.method()
Modal.useModal()
Design Token
FAQ
为什么 Modal 关闭时,内容不会更新?
为什么 Modal 方法不能获取 context、redux、的内容和 ConfigProvider locale/prefixCls/theme 等配置?
静态方法如何设置 prefixCls ?

Modal
对话框

  • Message全局提示Notification通知提醒框

    相关资源

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

    社区

    Awesome Namu Design
    Medium
    Twitter
    yuqueNamu Design 语雀专栏
    Namu Design 知乎专栏
    体验科技专栏
    seeconfSEE Conf-蚂蚁体验科技大会
    加入我们

    帮助

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

    Ant XTech更多产品

    yuque语雀-构建你的数字花园
    AntVAntV-数据可视化解决方案
    EggEgg-企业级 Node.js 框架
    kitchenKitchen-Sketch 工具集
    xtech蚂蚁体验科技
    主题编辑器
    Made with ❤ by
    蚂蚁集团和 Namu Design 开源社区

    模态对话框。

    何时使用

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

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

    代码演示

    基本

    第一个对话框。

    expand codeexpand code
    自定义页脚

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

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

    expand codeexpand code
    国际化

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

    expand codeexpand code


    自定义位置

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

    expand codeexpand code
    自定义渲染对话框

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

    expand codeexpand code
    静态方法

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

    expand codeexpand code
    销毁确认对话框

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

    expand codeexpand code
    异步关闭

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

    expand codeexpand code
    使用 hooks 获得上下文

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

    expand codeexpand code
    手动更新和移除

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

    expand codeexpand code
    自定义页脚按钮属性

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

    expand codeexpand code
    自定义模态的宽度

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

    expand codeexpand code
    静态确认对话框

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

    expand codeexpand code

    API

    通用属性参考:通用属性

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

    注意

    • <Modal /> 默认关闭后状态不会自动清空, 如果希望每次打开都是新内容,请设置 destroyOnClose。
    • <Modal /> 和 Form 一起配合使用时,设置 destroyOnClose 也不会在 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
    bodyStyleModal body 样式CSSProperties4.8.0
    cancelButtonPropscancel 按钮 propsButtonProps-
    cancelText设置 Modal.confirm 取消按钮文字string取消
    centered垂直居中展示 Modalbooleanfalse
    className容器类名string-
    closeIcon自定义关闭图标。5.7.0:设置为 null 或 false 时隐藏关闭按钮boolean | ReactNode<CloseOutlined />
    content内容ReactNode-
    footer底部内容,当不需要默认底部按钮时,可以设为 footer: nullReactNode-5.1.0
    getContainer指定 Modal 挂载的 HTML 节点, false 为挂载在当前 domHTMLElement | () => HTMLElement | Selectors | falsedocument.body
    icon自定义图标ReactNode<ExclamationCircleFilled />
    keyboard是否支持键盘 esc 关闭booleantrue
    mask是否展示遮罩booleantrue
    maskClosable点击蒙层是否允许关闭booleanfalse
    maskStyle遮罩样式object{}
    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 后自动关闭function(close)-
    onOk点击确定回调,参数为关闭函数,返回 promise 时 resolve 后自动关闭function(close)-

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

    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() 适用于主动关闭,而不是路由这样被动关闭)

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

    Modal.useModal()

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

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

    modal.confirm 返回方法:

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

    Design Token

    组件 Token

    全局 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 位置即可:

    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 进行设置。