Dialog 对话框
对话框。
使用场景#
需要用户处理事务,又不希望跳转页面以致打断工作流程时,可以使用 Dialog 在当前页面正中打开一个浮层,承载相应的操作。
另外当需要一个简洁的确认框询问用户时,可以使用 Dialog.confirm() 等快捷调用方法。
特性介绍#
对话框定位#
通过 placement 可以指定对话框在容器内的位置。对话框提供以下 9 种定位方式,默认为 <Dialog placement="center" />
containertop-lefttoptop-rightleftcenterrightbottom-leftbottombottom-right在 placement 的基础上,可以通过 offset={[offsetX, offsetY]} 设置对话框的偏移量。
组件内部结构#
组件提供了一个简单的对话框结构,分为 header / main / footer 三个部分,每个部分都支持在上层进行覆盖。
代码示例#
基本对话框#
作为普通组件使用时,对话框是否展示由 visible 进行控制。
非模态对话框#
对于一些非必选/不紧急的对话框,我们建议设置 canCloseByEsc={true} 和 canCloseByOutSideClick={true} 来使用非模态对话框。
快捷调用#
tip
Dialog.alert(...) 与 Dialog.confirm(...) 会返回一个 Promise,该 Promise 会 resolve 一个布尔值,表示用户进行了「确认」或「取消」.
嵌套对话框#
动态尺寸与方位#
通过 placement 来控制对话框的方位,组件内部内置了 ResizeObserver,当对话框内的尺寸发生变化时,组件会自动调整位置。
极简样式#
设置 minimal={true} 后,对话框只会保留最基本的定位功能与背景色,其余内容完全由上层进行控制。此时 title 和 footer 属性无效。
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 相同的创建通知方法。
Dialog Props#
| 字段 | 描述 | |
|---|---|---|
| style | CSSProperties | |
| className | string | |
| visible | boolean | |
| onRequestClose | (reason: any) => void | |
| content | ReactNode | |
| renderChildren | (pass: { ref: Ref<Element>; }) => ReactNode使用 render prop 的形式指定弹层内容,用于精确控制 DOM 结构 | |
| title | ReactNode | |
| footer | null | React.ReactElement | Action[] | |
| onOk | () => void | |
| onCancel | () => void | |
| placement | PositionPlacement = center | |
| offset | PositionOffset | |
| canCloseByIcon | boolean = false是否显示对话框关闭图标 | |
| 浮层交互 | ||
| canCloseByEsc | boolean = false是否支持 esc 按键关闭弹层 | |
| canCloseByOutSideClick | boolean = false点击弹层外部区域是否关闭弹层(注意背景层也被认为是外部) | |
| 浮层生命周期 | ||
| beforeOpen | (state?: any) => Promise<IOverlayAnimationProps>浮层即将被打开时的回调 | |
| onOpen | () => void浮层打开时的回调 | |
| afterOpen | () => void浮层打开时的回调 | |
| beforeClose | () => IOverlayAnimationProps浮层即将被关闭时的回调 | |
| onClose | () => void浮层关闭时的回调 | |
| afterClose | () => void浮层关闭后的回调 | |
| 背景层 | ||
| hasBackdrop | boolean = true是否展示背景层 | |
| backdropStyle | CSSProperties | |
| backdropClassName | string | |
| 浮层动画 | ||
| animationDuration | string = 200ms动画持续时间(注意该 prop 会作为 CSS 变量的值,使用时要带上单位,例如 `'500ms'`) | |
| animation | false | { in: string | Keyframes; out: string | Keyframes; }弹层的出现和消失的动画,可以用 Overlay.animations.{name} 来引用弹层组件内置的动画效果 | |
| 浮层容器 | ||
| usePortal | boolean是否使用 portal 来渲染弹层内容 | |
| portalContainer | HTMLElement | "DOCUMENT_BODY"渲染组件的容器 | |
| disableScroll | boolean | "force" = true是否禁用容器的滚动 | |
