用于生成弹层的工具类集合。
Overlay 提供了一系列组件用于创建弹层。其中包含:
v2 版本更新指示 #1.25 版本增加 v2 支持开启新版本弹,功能如下:
功能变化:
API变化:
Overlay 可以在页面中弹出一个浮层,封装了定位,动画及其他一些可用性的功能。Overlay 被设计为无状态的组件,其本身并不控制自己显示和隐藏的状态。
注意: 类似 canCloseby* 的配置也需要配合 onRequestClose 才能关闭弹层。
Overlay 提供了点击弹层外文档中节点隐藏该弹层的功能,如果想让某个节点点击后不隐藏弹层(如:触发弹层打开的节点),请将该节点传入 safeNode 属性。
align 的值可以是由空格隔开的字符串,如 tl bl,其中 tl 代表目标元素的左上方,bl 代表基准元素的左下方,所以 tl bl 的意思是目标元素的左上方对齐基准元素左下方。其中定位的可选值有 tl, tc, tr, cl, cc, cr, bl, bc, br。t 为 top 的缩写,b 为 bottom 的缩写,c 为 center 的缩写,l 为 left 的缩写,r 为 right 的缩写.
align 支持的 Boolean 值仅为 false,在设置为 false 时,不使用 JS 定位,这样你可以根据你的需要传入 style 或者 className 进行 CSS 定位。
rtl情况下会自动翻转 r(right)与 l(left),
Popup 是对 Overlay 的封装,它接收某个节点作为触发节点,弹出一个浮层,这个浮层默认情况下使用这个节点作为定位的参照对象。
| 参数 | 说明 | 类型 | 默认值 | 是否必填 | 支持版本 |
|---|---|---|---|---|---|
| children | 弹层内容 | React.ReactElement & { ref?: React.RefCallback<HTMLElement> } | - | - | |
| visible | 是否显示弹层 | boolean | false | - | |
| onRequestClose | 弹层请求关闭时触发事件的回调函数,v2 版本第一个参数是 event | (type: string, e: Event | React.MouseEvent<Element>) => void | - | - | |
| target | 弹层定位的参照元素 | PropTarget | Position.VIEWPORT | - | |
| align | 弹层相对于参照元素的定位,详见开发指南的 定位部分 | string | boolean | 'tl bl' | - | |
| offset | 弹层相对于 trigger 的定位的微调,接收数组 [hoz, ver], 表示弹层在 left / top 上的增量 e.g. [100, 100] 表示往右 (RTL 模式下是往左) 、下分布偏移 100px | Array<number> | [0, 0] | - | |
| container | 渲染组件的容器,如果是函数需要返回 ref,如果是字符串则是该 DOM 的 id,也可以直接传入 DOM 节点 | PropTarget | - | - | |
| hasMask | 是否显示遮罩 | boolean | false | - | |
| canCloseByEsc | 是否支持 esc 按键关闭弹层 | boolean | true | - | |
| canCloseByOutSideClick | 点击弹层外的区域是否关闭弹层,不显示遮罩时生效 | boolean | true | - | |
| canCloseByMask | 点击遮罩区域是否关闭弹层,显示遮罩时生效 | boolean | true | - | |
| beforeOpen | 弹层打开前触发事件的回调函数 | (target?: React.ReactNode) => void | - | - | |
| onOpen | 弹层打开时触发事件的回调函数 | (target?: React.ReactNode) => void | - | - | |
| afterOpen | 弹层打开后触发事件的回调函数,如果有动画,则在动画结束后触发 | (target?: React.ReactNode) => void | - | - | |
| beforeClose | 弹层关闭前触发事件的回调函数 | (target?: React.ReactNode) => void | - | - | |
| onClose | 弹层关闭时触发事件的回调函数 | (target?: React.ReactNode) => void | - | - | |
| afterClose | 弹层关闭后触发事件的回调函数,如果有动画,则在动画结束后触发 | (target?: React.ReactNode) => void | - | - | |
| beforePosition | 弹层定位完成前触发的事件 | () => void | - | - | |
| onPosition | 弹层定位完成时触发的事件 | (config: object, node?: object) => void | - | - | |
| shouldUpdatePosition | 是否在每次弹层重新渲染后强制更新定位信息,一般用于弹层内容区域大小发生变化时,仍需保持原来的定位方式 | boolean | false | - | |
| autoFocus | 弹层打开时是否让其中的元素自动获取焦点 | boolean | false | - | |
| needAdjust | 当弹层由于页面滚动等情况不在可视区域时,是否自动调整定位以出现在可视区域 | boolean | true | - | |
| disableScroll | 是否禁用页面滚动 | boolean | false | - | |
| cache | 隐藏时是否保留子节点 | boolean | false | - | |
| safeNode | 安全节点,当点击 document 的时候,如果包含该节点则不会关闭弹层,如果是函数需要返回 ref,如果是字符串则是该 DOM 的 id,也可以直接传入 DOM 节点,或者以上值组成的数组 | React.ReactNode | - | - | |
| wrapperClassName | 弹层的根节点的样式类 | string | - | - | |
| wrapperStyle | 弹层的根节点的内联样式 | React.CSSProperties | - | - | |
| animation | 配置动画的播放方式,支持 { in: 'enter-class', out: 'leave-class' } 的对象参数,如果设置为 false,则不播放动画。请参考 Animate 组件的文档获取可用的动画名 | string | boolean | AnimationObjectType | undefined | { in: 'expandInDown', out: 'expandOutUp' } | - | |
| v2 | 开启 v2 版本 | false | undefined | false | 1.25 | |
| points | [v2] align 的数组形式,不能和 align 同时使用 | Array<string> | - | 1.25 | |
| useCapture | 是否在捕获阶段监听,适配 react 17 事件模型变更 | boolean | - | 1.25 |
| 参数 | 说明 | 类型 | 默认值 | 是否必填 | 支持版本 |
|---|---|---|---|---|---|
| children | 弹层内容 | React.ReactElement & { ref?: React.RefCallback<HTMLElement> } | - | - | |
| visible | 是否显示弹层 | boolean | false | - | |
| onRequestClose | 弹层请求关闭时触发事件的回调函数,v2 版本第一个参数是 event | (type: string, e: Event | React.MouseEvent<Element>) => void | - | - | |
| target | 弹层定位的参照元素 | PropTarget | Position.VIEWPORT | - | |
| align | 弹层相对于参照元素的定位,详见开发指南的 定位部分 | string | 'tl bl' | - | |
| offset | 弹层相对于 trigger 的定位的微调,接收数组 [hoz, ver], 表示弹层在 left / top 上的增量 e.g. [100, 100] 表示往右 (RTL 模式下是往左) 、下分布偏移 100px | Array<number> | [0, 0] | - | |
| container | 渲染组件的容器,如果是函数需要返回 ref,如果是字符串则是该 DOM 的 id,也可以直接传入 DOM 节点 | PropTarget | - | - | |
| hasMask | 是否显示遮罩 | boolean | false | - | |
| canCloseByEsc | 是否支持 esc 按键关闭弹层 | boolean | true | - | |
| canCloseByOutSideClick | 点击弹层外的区域是否关闭弹层,不显示遮罩时生效 | boolean | true | - | |
| canCloseByMask | 点击遮罩区域是否关闭弹层,显示遮罩时生效 | boolean | true | - | |
| beforeOpen | 弹层打开前触发事件的回调函数 | (target?: React.ReactNode) => void | - | - | |
| onOpen | 弹层打开时触发事件的回调函数 | (target?: React.ReactNode) => void | - | - | |
| afterOpen | 弹层打开后触发事件的回调函数,如果有动画,则在动画结束后触发 | (target?: React.ReactNode) => void | - | - | |
| beforeClose | 弹层关闭前触发事件的回调函数 | (target?: React.ReactNode) => void | - | - | |
| onClose | 弹层关闭时触发事件的回调函数 | (target?: React.ReactNode) => void | - | - | |
| afterClose | 弹层关闭后触发事件的回调函数,如果有动画,则在动画结束后触发 | (target?: React.ReactNode) => void | - | - | |
| beforePosition | 弹层定位完成前触发的事件 | () => void | - | - | |
| onPosition | 弹层定位完成时触发的事件 | (config: object, node?: object) => void | - | - | |
| shouldUpdatePosition | 是否在每次弹层重新渲染后强制更新定位信息,一般用于弹层内容区域大小发生变化时,仍需保持原来的定位方式 | boolean | false | - | |
| autoFocus | 弹层打开时是否让其中的元素自动获取焦点 | boolean | false | - | |
| disableScroll | 是否禁用页面滚动 | boolean | false | - | |
| cache | 隐藏时是否保留子节点 | boolean | false | - | |
| safeNode | 安全节点,当点击 document 的时候,如果包含该节点则不会关闭弹层,如果是函数需要返回 ref,如果是字符串则是该 DOM 的 id,也可以直接传入 DOM 节点,或者以上值组成的数组 | React.ReactNode | - | - | |
| wrapperClassName | 弹层的根节点的样式类 | string | - | - | |
| wrapperStyle | 弹层的根节点的内联样式 | React.CSSProperties | - | - | |
| animation | 配置动画的播放方式,支持 { in: 'enter-class', out: 'leave-class' } 的对象参数,如果设置为 false,则不播放动画。请参考 Animate 组件的文档获取可用的动画名 | string | false | AnimationObjectType | undefined | { in: 'expandInDown', out: 'expandOutUp' } | - | |
| v2 | 开启 v2 版本 | true | false | 1.25 | |
| points | [v2] align 的数组形式,不能和 align 同时使用 | Array<string> | - | 1.25 | |
| useCapture | 是否在捕获阶段监听,适配 react 17 事件模型变更 | boolean | - | 1.25 |
| 参数 | 说明 | 类型 | 默认值 | 是否必填 |
|---|---|---|---|---|
| autoAdjust | [v2] 浮窗被遮挡时是否自动调整位置 | boolean | - | |
| children | 弹层内容 | React.ReactElement | - | |
| autoFit | 弹层是否自适应内容 | boolean | false | |
| visible | 弹层当前是否显示 | boolean | false | |
| target | 弹层定位的参照元素 | PropTarget | - | |
| trigger | 触发弹层显示或隐藏的元素 | React.ReactElement | - | |
| triggerType | 触发弹层显示或隐藏的操作类型,可以是 'click','hover','focus',或者它们组成的数组,如 ['hover', 'focus'] | 'click' | 'hover' | 'focus' | Array<'click' | 'hover' | 'focus'> | 'hover' | |
| triggerClickKeycode | 当 triggerType 为 click 时才生效,可自定义触发弹层显示的键盘码 | number | Array<number> | [KEYCODE.SPACE, KEYCODE.ENTER] | |
| defaultVisible | 弹层默认是否显示 | boolean | false | |
| onVisibleChange | 弹层显示或隐藏时触发的回调函数,v2 版本第二个参数是 event | (visible: boolean, type: string | object, e?: object) => void | - | |
| disabled | 设置此属性,弹层无法显示或隐藏 | boolean | false | |
| delay | 弹层显示或隐藏的延时时间(以毫秒为单位),在 triggerType 被设置为 hover 时生效 | number | 200 | |
| mouseEnterDelay | 鼠标放置后的延时显示,单位毫秒 ms, 优先级高于 delay | number | - | |
| mouseLeaveDelay | 鼠标离开后的延时显示,单位毫秒 ms, 优先级高于 delay | number | - | |
| canCloseByTrigger | trigger 是否可以关闭弹层 | boolean | true | |
| followTrigger | 是否跟随 trigger 滚动 | boolean | false | |
| v2 | 开启 v2 版本 | false | undefined | - | |
| placement | [v2] 快捷位置 | string | 'tr' |
| 参数 | 说明 | 类型 | 默认值 | 是否必填 |
|---|---|---|---|---|
| autoAdjust | [v2] 浮窗被遮挡时是否自动调整位置 | boolean | - | |
| children | 弹层内容 | React.ReactElement | - | |
| autoFit | 弹层是否自适应内容 | boolean | false | |
| visible | 弹层当前是否显示 | boolean | false | |
| target | 弹层定位的参照元素 | PropTarget | - | |
| trigger | 触发弹层显示或隐藏的元素 | React.ReactElement | - | |
| triggerType | 触发弹层显示或隐藏的操作类型,可以是 'click','hover','focus',或者它们组成的数组,如 ['hover', 'focus'] | 'click' | 'hover' | 'focus' | Array<'click' | 'hover' | 'focus'> | 'hover' | |
| triggerClickKeycode | 当 triggerType 为 click 时才生效,可自定义触发弹层显示的键盘码 | number | Array<number> | [KEYCODE.SPACE, KEYCODE.ENTER] | |
| defaultVisible | 弹层默认是否显示 | boolean | false | |
| onVisibleChange | 弹层显示或隐藏时触发的回调函数,v2 版本第二个参数是 event | (visible: boolean, type: string | object, e?: object) => void | - | |
| disabled | 设置此属性,弹层无法显示或隐藏 | boolean | false | |
| delay | 弹层显示或隐藏的延时时间(以毫秒为单位),在 triggerType 被设置为 hover 时生效 | number | 200 | |
| mouseEnterDelay | 鼠标放置后的延时显示,单位毫秒 ms, 优先级高于 delay | number | - | |
| mouseLeaveDelay | 鼠标离开后的延时显示,单位毫秒 ms, 优先级高于 delay | number | - | |
| canCloseByTrigger | trigger 是否可以关闭弹层 | boolean | true | |
| followTrigger | 是否跟随 trigger 滚动 | boolean | false | |
| v2 | 开启 v2 版本 | true | - | |
| placement | [v2] 快捷位置 | string | 'tr' |
| 参数 | 说明 | 类型 | 默认值 | 是否必填 |
|---|---|---|---|---|
| children | 弹层内容 | React.ReactElement | - | |
| target | 弹层定位的参照元素 | PropTarget | 'viewport' | - |
| 参数 | 说明 | 类型 | 默认值 | 是否必填 |
|---|---|---|---|---|
| children | 弹层内容 | null | (React.ReactElement & { ref?: React.RefCallback<HTMLElement> | string }) | - | |
| target | 弹层定位的参照元素 | PropTarget | - |
export type AnimationObjectType = Record<'in' | 'out', string>;
export type Target<T = unknown> =
| React.ReactInstance
| string
| ((param?: T) => React.ReactInstance | Element | Text | Node | null | void | undefined)
| Element
| Node
| Text
| null
| false
| undefined;
说明: 此组件需要结合其他组件使用,会有提示。