Skip to main content

Dialog 对话框

对话框。

使用场景#

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

另外当需要一个简洁的确认框询问用户时,可以使用 Dialog.confirm() 等快捷调用方法。

特性介绍#

对话框定位#

通过 placement 可以指定对话框在容器内的位置。对话框提供以下 9 种定位方式,默认为 <Dialog placement="center" />

container
top-left
top
top-right
left
center
right
bottom-left
bottom
bottom-right

placement 的基础上,可以通过 offset={[offsetX, offsetY]} 设置对话框的偏移量。

组件内部结构#

组件提供了一个简单的对话框结构,分为 header / main / footer 三个部分,每个部分都支持在上层进行覆盖。

<Dialog title={title}>
{children}
</Dialog>
// 对应的 DOM 结构如下
<div className="rex-dialog">
<div className="rex-dialog-header">{title}</div>
<div className="rex-dialog-body">{children}</div>
<div className="rex-dialog-footer">
<button>取消</button>
<button>确认</button>
</div>
</div>

代码示例#

基本对话框#

作为普通组件使用时,对话框是否展示由 visible 进行控制。

noInline

非模态对话框#

对于一些非必选/不紧急的对话框,我们建议设置 canCloseByEsc={true}canCloseByOutSideClick={true} 来使用非模态对话框。

noInline

快捷调用#

inline

tip

Dialog.alert(...)Dialog.confirm(...) 会返回一个 Promise,该 Promise 会 resolve 一个布尔值,表示用户进行了「确认」或「取消」.

嵌套对话框#

noInline

动态尺寸与方位#

通过 placement 来控制对话框的方位,组件内部内置了 ResizeObserver,当对话框内的尺寸发生变化时,组件会自动调整位置。

noInline

极简样式#

设置 minimal={true} 后,对话框只会保留最基本的定位功能与背景色,其余内容完全由上层进行控制。此时 title 和 footer 属性无效。

noInline

API#

快捷调用#

Dialog.show(config): string#

根据 config 打开一个快捷对话框,config.title 作为对话框的标题, config.content 作为对话框的内容,其他属性详见 Dialog Props

返回一个字符串 key 表示该对话框实例,调用 Dialog.close(key) 可以主动关闭该对话框。

Dialog.confirm(config)#

根据 config 打开一个快捷「确认」对话框,返回 Promise<boolean> 表示用户进行了「确认」或「取消」。

Dialog.alert(config)#

根据 config 打开一个快捷「警告」对话框,返回 Promise<true> 表示用户进行了「确认」。

Dialog.close(key)#

关闭一个对话框。

Dialog.closeAll()#

关闭所有对话框。

Dialog.useDialog()#

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

const [dialog, contextHolder] = Dialog.useDialog();
React.useEffect(() => {
dialog.confirm({
// ...
});
}, []);
return <div>{contextHolder}</div>;

Dialog Props#

字段描述
styleCSSProperties
classNamestring
visibleboolean
onRequestClose(reason: any) => void
contentReactNode
renderChildren(pass: { ref: Ref<Element>; }) => ReactNode
使用 render prop 的形式指定弹层内容,用于精确控制 DOM 结构
titleReactNode
footernull | React.ReactElement | Action[]
onOk() => void
onCancel() => void
placementPositionPlacement = center
offsetPositionOffset
canCloseByIconboolean = false
是否显示对话框关闭图标
浮层交互
canCloseByEscboolean = false
是否支持 esc 按键关闭弹层
canCloseByOutSideClickboolean = false
点击弹层外部区域是否关闭弹层(注意背景层也被认为是外部)
浮层生命周期
beforeOpen(state?: any) => Promise<IOverlayAnimationProps>
浮层即将被打开时的回调
onOpen() => void
浮层打开时的回调
afterOpen() => void
浮层打开时的回调
beforeClose() => IOverlayAnimationProps
浮层即将被关闭时的回调
onClose() => void
浮层关闭时的回调
afterClose() => void
浮层关闭后的回调
背景层
hasBackdropboolean = true
是否展示背景层
backdropStyleCSSProperties
backdropClassNamestring
浮层动画
animationDurationstring = 200ms
动画持续时间(注意该 prop 会作为 CSS 变量的值,使用时要带上单位,例如 `'500ms'`)
animationfalse | { in: string | Keyframes; out: string | Keyframes; }
弹层的出现和消失的动画,可以用 Overlay.animations.{name} 来引用弹层组件内置的动画效果
浮层容器
usePortalboolean
是否使用 portal 来渲染弹层内容
portalContainerHTMLElement | "DOCUMENT_BODY"
渲染组件的容器
disableScrollboolean | "force" = true
是否禁用容器的滚动
Copyright © 2021 Alibaba Inc.
Built with ❤️ by hema-FE.