Skip to content

Commit

Permalink
feat(Dialog&Drawer): support beforeOpen And beforeClose API
Browse files Browse the repository at this point in the history
chore: docs
  • Loading branch information
Wesley-0808 committed Nov 14, 2024
1 parent bc077d3 commit 3390e6a
Show file tree
Hide file tree
Showing 10 changed files with 149 additions and 58 deletions.
10 changes: 8 additions & 2 deletions src/dialog/dialog.en-US.md
Original file line number Diff line number Diff line change
Expand Up @@ -49,17 +49,19 @@ attach | String / Function | - | Typescript: `AttachNode`. [see more ts definiti
body | String / Slot / Function | - | Typescript: `string \| TNode`. [see more ts definition](https://github.com/Tencent/tdesign-vue/blob/develop/src/common.ts) | N
cancelBtn | String / Object / Slot / Function | - | Typescript: `string \| ButtonProps \| TNode \| null`[Button API Documents](./button?tab=api). [see more ts definition](https://github.com/Tencent/tdesign-vue/blob/develop/src/common.ts). [see more ts definition](https://github.com/Tencent/tdesign-vue/tree/develop/src/dialog/type.ts) | N
closeBtn | String / Boolean / Slot / Function | true | Typescript: `string \| boolean \| TNode`. [see more ts definition](https://github.com/Tencent/tdesign-vue/blob/develop/src/common.ts) | N
closeOnEscKeydown | Boolean | true | \- | N
closeOnEscKeydown | Boolean | true | trigger dialog close event on `ESC` keydown | N
closeOnOverlayClick | Boolean | true | \- | N
confirmBtn | String / Object / Slot / Function | - | Typescript: `string \| ButtonProps \| TNode \| null`. [see more ts definition](https://github.com/Tencent/tdesign-vue/blob/develop/src/common.ts) | N
confirmLoading | Boolean | undefined | confirm button loading status | N
confirmOnEnter | Boolean | - | confirm on enter | N
default | String / Slot / Function | - | Typescript: `string \| TNode`. [see more ts definition](https://github.com/Tencent/tdesign-vue/blob/develop/src/common.ts) | N
destroyOnClose | Boolean | false | \- | N
dialogClassName | String | - | \- | N
dialogStyle | Object | - | Styles that apply to the dialog box itself. Typescript: `Styles`. [see more ts definition](https://github.com/Tencent/tdesign-vue/blob/develop/src/common.ts) | N
draggable | Boolean | false | \- | N
footer | Boolean / Slot / Function | true | Typescript: `boolean \| TNode`. [see more ts definition](https://github.com/Tencent/tdesign-vue/blob/develop/src/common.ts) | N
header | String / Boolean / Slot / Function | true | Typescript: `string \| boolean \| TNode`. [see more ts definition](https://github.com/Tencent/tdesign-vue/blob/develop/src/common.ts) | N
mode | String | modal | options: modal/modeless/full-screen | N
mode | String | modal | options: modal/modeless/normal/full-screen | N
placement | String | top | options: top/center | N
preventScrollThrough | Boolean | true | \- | N
showInAttachedElement | Boolean | false | \- | N
Expand All @@ -69,6 +71,8 @@ top | String / Number | - | \- | N
visible | Boolean | - | \- | N
width | String / Number | - | \- | N
zIndex | Number | - | \- | N
onBeforeClose | Function | | Typescript: `() => void`<br/> | N
onBeforeOpen | Function | | Typescript: `() => void`<br/> | N
onCancel | Function | | Typescript: `(context: { e: MouseEvent }) => void`<br/> | N
onClose | Function | | Typescript: `(context: DialogCloseContext) => void`<br/>[see more ts definition](https://github.com/Tencent/tdesign-vue/tree/develop/src/dialog/type.ts). <br/>`type DialogEventSource = 'esc' \| 'close-btn' \| 'cancel' \| 'overlay'`<br/><br/>`interface DialogCloseContext { trigger: DialogEventSource; e: MouseEvent \| KeyboardEvent }`<br/> | N
onCloseBtnClick | Function | | Typescript: `(context: { e: MouseEvent }) => void`<br/> | N
Expand All @@ -82,6 +86,8 @@ onOverlayClick | Function | | Typescript: `(context: { e: MouseEvent }) => void

name | params | description
-- | -- | --
before-close | \- | \-
before-open | \- | \-
cancel | `(context: { e: MouseEvent })` | \-
close | `(context: DialogCloseContext)` | [see more ts definition](https://github.com/Tencent/tdesign-vue/tree/develop/src/dialog/type.ts). <br/>`type DialogEventSource = 'esc' \| 'close-btn' \| 'cancel' \| 'overlay'`<br/><br/>`interface DialogCloseContext { trigger: DialogEventSource; e: MouseEvent \| KeyboardEvent }`<br/>
close-btn-click | `(context: { e: MouseEvent })` | \-
Expand Down
18 changes: 12 additions & 6 deletions src/dialog/dialog.md
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@
## API
### Dialog Props

名称 | 类型 | 默认值 | 说明 | 必传
名称 | 类型 | 默认值 | 描述 | 必传
-- | -- | -- | -- | --
attach | String / Function | - | 对话框挂载的节点。数据类型为 String 时,会被当作选择器处理,进行节点查询。示例:'body' 或 () => document.body。TS 类型:`AttachNode`[通用类型定义](https://github.com/Tencent/tdesign-vue/blob/develop/src/common.ts) | N
body | String / Slot / Function | - | 对话框内容。TS 类型:`string \| TNode`[通用类型定义](https://github.com/Tencent/tdesign-vue/blob/develop/src/common.ts) | N
Expand All @@ -50,10 +50,12 @@ confirmLoading | Boolean | undefined | 确认按钮加载状态 | N
confirmOnEnter | Boolean | - | 是否在按下回车键时,触发确认事件 | N
default | String / Slot / Function | - | 对话框内容,同 body。TS 类型:`string \| TNode`[通用类型定义](https://github.com/Tencent/tdesign-vue/blob/develop/src/common.ts) | N
destroyOnClose | Boolean | false | 是否在关闭弹框的时候销毁子元素 | N
dialogClassName | String | - | 弹框元素类名,示例:'t-class-dialog-first t-class-dialog-second' | N
dialogStyle | Object | - | 作用于对话框本身的样式。TS 类型:`Styles`[通用类型定义](https://github.com/Tencent/tdesign-vue/blob/develop/src/common.ts) | N
draggable | Boolean | false | 对话框是否可以拖拽(仅在非模态对话框时有效) | N
footer | Boolean / Slot / Function | true | 底部操作栏,默认会有“确认”和“取消”两个按钮。值为 true 显示默认操作按钮,值为 false 不显示任何内容,值类型为 Function 表示自定义底部内容。TS 类型:`boolean \| TNode`[通用类型定义](https://github.com/Tencent/tdesign-vue/blob/develop/src/common.ts) | N
header | String / Boolean / Slot / Function | true | 头部内容。值为 true 显示空白头部,值为 false 不显示任何内容,值类型为 string 则直接显示值,值类型为 Function 表示自定义头部内容。TS 类型:`string \| boolean \| TNode`[通用类型定义](https://github.com/Tencent/tdesign-vue/blob/develop/src/common.ts) | N
mode | String | modal | 对话框类型,有 3 种:模态对话框、非模态对话框、全屏对话框。弹出「模态对话框」时,只能操作对话框里面的内容,不能操作其他内容。弹出「非模态对话框」时,则可以操作页面内所有内容。「普通对话框」是指没有脱离文档流的对话框,可以在这个基础上开发更多的插件。可选项:modal/modeless/full-screen | N
mode | String | modal | 对话框类型,有 4 种:模态对话框、非模态对话框、普通对话框、全屏对话框。弹出「模态对话框」时,只能操作对话框里面的内容,不能操作其他内容。弹出「非模态对话框」时,则可以操作页面内所有内容。「普通对话框」是指没有脱离文档流的对话框,可以在这个基础上开发更多的插件。可选项:modal/modeless/normal/full-screen | N
placement | String | top | 对话框位置,内置两种:垂直水平居中显示 和 靠近顶部(top:20%)显示。默认情况,为避免贴顶或贴底,顶部和底部距离最小为 `48px`,可通过调整 `top` 覆盖默认大小。可选项:top/center | N
preventScrollThrough | Boolean | true | 防止滚动穿透 | N
showInAttachedElement | Boolean | false | 仅在挂载元素中显示抽屉,默认在浏览器可视区域显示。父元素需要有定位属性,如:position: relative | N
Expand All @@ -63,6 +65,8 @@ top | String / Number | - | 用于弹框具体窗口顶部的距离,优先级
visible | Boolean | - | 控制对话框是否显示 | N
width | String / Number | - | 对话框宽度,示例:320, '500px', '80%' | N
zIndex | Number | - | 对话框层级,Web 侧样式默认为 2500,移动端和小程序样式默认为 1500 | N
onBeforeClose | Function | | TS 类型:`() => void`<br/>对话框执行消失动画效果前触发 | N
onBeforeOpen | Function | | TS 类型:`() => void`<br/>对话框执行弹出动画效果前触发 | N
onCancel | Function | | TS 类型:`(context: { e: MouseEvent }) => void`<br/>如果“取消”按钮存在,则点击“取消”按钮时触发,同时触发关闭事件 | N
onClose | Function | | TS 类型:`(context: DialogCloseContext) => void`<br/>关闭事件,点击取消按钮、点击关闭按钮、点击蒙层、按下 ESC 等场景下触发。[详细类型定义](https://github.com/Tencent/tdesign-vue/tree/develop/src/dialog/type.ts)。<br/>`type DialogEventSource = 'esc' \| 'close-btn' \| 'cancel' \| 'overlay'`<br/><br/>`interface DialogCloseContext { trigger: DialogEventSource; e: MouseEvent \| KeyboardEvent }`<br/> | N
onCloseBtnClick | Function | | TS 类型:`(context: { e: MouseEvent }) => void`<br/>点击右上角关闭按钮时触发 | N
Expand All @@ -76,6 +80,8 @@ onOverlayClick | Function | | TS 类型:`(context: { e: MouseEvent }) => void

名称 | 参数 | 描述
-- | -- | --
before-close | \- | 对话框执行消失动画效果前触发
before-open | \- | 对话框执行弹出动画效果前触发
cancel | `(context: { e: MouseEvent })` | 如果“取消”按钮存在,则点击“取消”按钮时触发,同时触发关闭事件
close | `(context: DialogCloseContext)` | 关闭事件,点击取消按钮、点击关闭按钮、点击蒙层、按下 ESC 等场景下触发。[详细类型定义](https://github.com/Tencent/tdesign-vue/tree/develop/src/dialog/type.ts)。<br/>`type DialogEventSource = 'esc' \| 'close-btn' \| 'cancel' \| 'overlay'`<br/><br/>`interface DialogCloseContext { trigger: DialogEventSource; e: MouseEvent \| KeyboardEvent }`<br/>
close-btn-click | `(context: { e: MouseEvent })` | 点击右上角关闭按钮时触发
Expand All @@ -87,7 +93,7 @@ overlay-click | `(context: { e: MouseEvent })` | 如果蒙层存在,点击蒙

### DialogOptions

名称 | 类型 | 默认值 | 说明 | 必传
名称 | 类型 | 默认值 | 描述 | 必传
-- | -- | -- | -- | --
attach | String / Function | 'body' | 对话框挂载的节点。数据类型为 String 时,会被当作选择器处理,进行节点查询。示例:'body' 或 () => document.body。TS 类型:`AttachNode`[通用类型定义](https://github.com/Tencent/tdesign-vue/blob/develop/src/common.ts) | N
className | String | - | 弹框类名,示例:'t-class-dialog-first t-class-dialog-second' | N
Expand All @@ -108,7 +114,7 @@ update | `(props: DialogOptions)` | \- | 必需。更新弹框内容

同时也支持 `this.$dialog`

参数名称 | 参数类型 | 参数默认值 | 参数说明
参数名称 | 参数类型 | 参数默认值 | 参数描述
-- | -- | -- | --
options | \- | - | TS 类型:`DialogOptions`

Expand All @@ -118,7 +124,7 @@ options | \- | - | TS 类型:`DialogOptions`

同时也支持 `this.$dialog.confirm`

参数名称 | 参数类型 | 参数默认值 | 参数说明
参数名称 | 参数类型 | 参数默认值 | 参数描述
-- | -- | -- | --
options | \- | - | TS 类型:`DialogOptions`

Expand All @@ -128,7 +134,7 @@ options | \- | - | TS 类型:`DialogOptions`

同时也支持 `this.$dialog.alert`

参数名称 | 参数类型 | 参数默认值 | 参数说明
参数名称 | 参数类型 | 参数默认值 | 参数描述
-- | -- | -- | --
options | Object | - | TS 类型:`Omit<DialogOptions, 'cancelBtn'>`

Expand Down
10 changes: 10 additions & 0 deletions src/dialog/dialog.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -303,10 +303,18 @@ export default mixins(ActionMixin, getConfigReceiverMixins<Vue, DialogConfig>('d
confirmBtnAction(e: MouseEvent) {
emitEvent<Parameters<TdDialogProps['onConfirm']>>(this, 'confirm', { e });
},
// 打开弹窗动画开始时事件
beforeEnter() {
emitEvent<Parameters<TdDialogProps['onBeforeOpen']>>(this, 'before-open');
},
// 打开弹窗动画结束时事件
afterEnter() {
emitEvent<Parameters<TdDialogProps['onOpened']>>(this, 'opened');
},
// 关闭弹窗动画开始时事件
beforeLeave() {
emitEvent<Parameters<TdDialogProps['onBeforeClose']>>(this, 'before-close');
},
// 关闭弹窗动画结束时事件
afterLeave() {
if (this.isModeLess && this.draggable) {
Expand Down Expand Up @@ -505,7 +513,9 @@ export default mixins(ActionMixin, getConfigReceiverMixins<Vue, DialogConfig>('d
<transition
duration={300}
name={`${this.componentName}-zoom__vue`}
onBeforeEnter={this.beforeEnter}
onAfterEnter={this.afterEnter}
onBeforeLeave={this.beforeLeave}
onAfterLeave={this.afterLeave}
>
<div v-show={this.visible} class={this.ctxClass} style={ctxStyle} v-transfer-dom={this.attach}>
Expand Down
22 changes: 16 additions & 6 deletions src/dialog/props.ts
Original file line number Diff line number Diff line change
Expand Up @@ -31,10 +31,7 @@ export default {
default: undefined,
},
/** 点击蒙层时是否触发关闭事件 */
closeOnOverlayClick: {
type: Boolean,
default: undefined,
},
closeOnOverlayClick: Boolean,
/** 确认按钮。值为 null 则不显示确认按钮。值类型为字符串,则表示自定义按钮文本,值类型为 Object 则表示透传 Button 组件属性。使用 TNode 自定义按钮时,需自行控制确认事件 */
confirmBtn: {
type: [String, Object, Function] as PropType<TdDialogProps['confirmBtn']>,
Expand All @@ -52,6 +49,15 @@ export default {
},
/** 是否在关闭弹框的时候销毁子元素 */
destroyOnClose: Boolean,
/** 弹框元素类名,示例:'t-class-dialog-first t-class-dialog-second' */
dialogClassName: {
type: String,
default: '',
},
/** 作用于对话框本身的样式 */
dialogStyle: {
type: Object as PropType<TdDialogProps['dialogStyle']>,
},
/** 对话框是否可以拖拽(仅在非模态对话框时有效) */
draggable: Boolean,
/** 底部操作栏,默认会有“确认”和“取消”两个按钮。值为 true 显示默认操作按钮,值为 false 不显示任何内容,值类型为 Function 表示自定义底部内容 */
Expand All @@ -64,13 +70,13 @@ export default {
type: [String, Boolean, Function] as PropType<TdDialogProps['header']>,
default: true,
},
/** 对话框类型,有 3 种:模态对话框、非模态对话框、全屏对话框。弹出「模态对话框」时,只能操作对话框里面的内容,不能操作其他内容。弹出「非模态对话框」时,则可以操作页面内所有内容。「普通对话框」是指没有脱离文档流的对话框,可以在这个基础上开发更多的插件 */
/** 对话框类型,有 4 种:模态对话框、非模态对话框、普通对话框、全屏对话框。弹出「模态对话框」时,只能操作对话框里面的内容,不能操作其他内容。弹出「非模态对话框」时,则可以操作页面内所有内容。「普通对话框」是指没有脱离文档流的对话框,可以在这个基础上开发更多的插件 */
mode: {
type: String as PropType<TdDialogProps['mode']>,
default: 'modal' as TdDialogProps['mode'],
validator(val: TdDialogProps['mode']): boolean {
if (!val) return true;
return ['modal', 'normal', 'modeless', 'full-screen'].includes(val);
return ['modal', 'modeless', 'normal', 'full-screen'].includes(val);
},
},
/** 对话框位置,内置两种:垂直水平居中显示 和 靠近顶部(top:20%)显示。默认情况,为避免贴顶或贴底,顶部和底部距离最小为 `48px`,可通过调整 `top` 覆盖默认大小 */
Expand Down Expand Up @@ -117,6 +123,10 @@ export default {
zIndex: {
type: Number,
},
/** 对话框执行消失动画效果前触发 */
onBeforeClose: Function as PropType<TdDialogProps['onBeforeClose']>,
/** 对话框执行弹出动画效果前触发 */
onBeforeOpen: Function as PropType<TdDialogProps['onBeforeOpen']>,
/** 如果“取消”按钮存在,则点击“取消”按钮时触发,同时触发关闭事件 */
onCancel: Function as PropType<TdDialogProps['onCancel']>,
/** 关闭事件,点击取消按钮、点击关闭按钮、点击蒙层、按下 ESC 等场景下触发 */
Expand Down
20 changes: 19 additions & 1 deletion src/dialog/type.ts
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ export interface TdDialogProps {
closeOnEscKeydown?: boolean;
/**
* 点击蒙层时是否触发关闭事件
* @default false
*/
closeOnOverlayClick?: boolean;
/**
Expand All @@ -54,6 +55,15 @@ export interface TdDialogProps {
* @default false
*/
destroyOnClose?: boolean;
/**
* 弹框元素类名,示例:'t-class-dialog-first t-class-dialog-second'
* @default ''
*/
dialogClassName?: string;
/**
* 作用于对话框本身的样式
*/
dialogStyle?: Styles;
/**
* 对话框是否可以拖拽(仅在非模态对话框时有效)
* @default false
Expand All @@ -70,7 +80,7 @@ export interface TdDialogProps {
*/
header?: string | boolean | TNode;
/**
* 对话框类型,有 3 种:模态对话框、非模态对话框、全屏对话框。弹出「模态对话框」时,只能操作对话框里面的内容,不能操作其他内容。弹出「非模态对话框」时,则可以操作页面内所有内容。「普通对话框」是指没有脱离文档流的对话框,可以在这个基础上开发更多的插件
* 对话框类型,有 4 种:模态对话框、非模态对话框、普通对话框、全屏对话框。弹出「模态对话框」时,只能操作对话框里面的内容,不能操作其他内容。弹出「非模态对话框」时,则可以操作页面内所有内容。「普通对话框」是指没有脱离文档流的对话框,可以在这个基础上开发更多的插件
* @default modal
*/
mode?: 'modal' | 'modeless' | 'normal' | 'full-screen';
Expand Down Expand Up @@ -115,6 +125,14 @@ export interface TdDialogProps {
* 对话框层级,Web 侧样式默认为 2500,移动端和小程序样式默认为 1500
*/
zIndex?: number;
/**
* 对话框执行消失动画效果前触发
*/
onBeforeClose?: () => void;
/**
* 对话框执行弹出动画效果前触发
*/
onBeforeOpen?: () => void;
/**
* 如果“取消”按钮存在,则点击“取消”按钮时触发,同时触发关闭事件
*/
Expand Down
Loading

0 comments on commit 3390e6a

Please sign in to comment.