diff --git a/packages/components/dialog/Dialog.tsx b/packages/components/dialog/Dialog.tsx index 6c1896afee..32f475c606 100644 --- a/packages/components/dialog/Dialog.tsx +++ b/packages/components/dialog/Dialog.tsx @@ -17,6 +17,7 @@ import useDialogDrag from './hooks/useDialogDrag'; import useDialogEsc from './hooks/useDialogEsc'; import useDialogPosition from './hooks/useDialogPosition'; import useLockStyle from './hooks/useLockStyle'; + import type { StyledProps } from '../common'; import type { DialogInstance, TdDialogProps } from './type'; @@ -27,15 +28,17 @@ export interface DialogProps extends TdDialogProps, StyledProps { const Dialog = forwardRef((originalProps, ref) => { const props = useDefaultProps(originalProps, dialogDefaultProps); const { children, ...restProps } = props; - const { classPrefix } = useConfig(); + const { classPrefix } = useConfig(); const componentCls = `${classPrefix}-dialog`; + const wrapRef = useRef(null); const maskRef = useRef(null); const contentClickRef = useRef(false); const dialogCardRef = useRef(null); const dialogPosition = useRef(null); const portalRef = useRef(null); + const [state, setState] = useSetState({ isPlugin: false, ...restProps }); const [local] = useLocaleReceiver('dialog'); @@ -72,6 +75,9 @@ const Dialog = forwardRef((originalProps, ref) => { ...restState } = state; + const isModeless = mode === 'modeless'; + const isFullScreen = mode === 'full-screen'; + const dialogAttach = useAttach('dialog', attach); useLockStyle({ preventScrollThrough, visible, mode, showInAttachedElement }); @@ -79,7 +85,7 @@ const Dialog = forwardRef((originalProps, ref) => { useDialogPosition(visible, dialogCardRef); useDialogDrag({ dialogCardRef, - canDraggable: draggable && mode === 'modeless', + canDraggable: draggable && isModeless, }); useDeepEffect(() => { @@ -113,6 +119,8 @@ const Dialog = forwardRef((originalProps, ref) => { } const onMaskClick = (e: React.MouseEvent) => { + if (isModeless) return; + if (showOverlay && (closeOnOverlayClick ?? local.closeOnOverlayClick)) { // 判断点击事件初次点击是否为内容区域 if (contentClickRef.current) { @@ -189,6 +197,7 @@ const Dialog = forwardRef((originalProps, ref) => { ) : null; }; + return ( ((originalProps, ref) => { className={classNames(className, `${componentCls}__ctx`, `${componentCls}__${mode}`, { [`${componentCls}__ctx--fixed`]: !showInAttachedElement, [`${componentCls}__ctx--absolute`]: showInAttachedElement, + [`${componentCls}__ctx--modeless`]: isModeless, })} style={{ zIndex, display: 'none' }} onKeyDown={handleKeyDown} @@ -217,11 +227,14 @@ const Dialog = forwardRef((originalProps, ref) => {
((originalProps, ref) => { { children?: React.ReactNode; + mode?: TdDialogProps['mode']; } const renderDialogButton = (btn: DialogCardProps['cancelBtn'], defaultProps: ButtonProps) => { @@ -28,7 +31,7 @@ const renderDialogButton = (btn: DialogCardProps['cancelBtn'], defaultProps: But } else if (isValidElement(btn)) { result = btn; } else if (isObject(btn)) { - result = - - + + + + + - { - console.log('on click close btn'); - }} - onOpened={() => { - console.log('dialog is open'); - }} - > -

This is a dialog

-
{ - console.log('dialog is open'); - }} + header="非模态对话框(可拖拽)" + draggable + visible={modelessAndDraggable} + onClose={() => setModelessAndDraggable(false)} > - +

This is a dialog

- { - console.log('dialog is open'); - }} - > + setModeless(false)}>

This is a dialog

- + setModal(false)}>

This is a dialog

-
+
); } diff --git a/packages/components/dialog/_usage/props.json b/packages/components/dialog/_usage/props.json index 0e663a1a46..1852cc13e7 100644 --- a/packages/components/dialog/_usage/props.json +++ b/packages/components/dialog/_usage/props.json @@ -55,8 +55,8 @@ "value": "modeless" }, { - "label": "normal", - "value": "normal" + "label": "full-screen", + "value": "full-screen" } ] }, @@ -119,11 +119,5 @@ "value": "success" } ] - }, - { - "name": "visible", - "type": "Boolean", - "defaultValue": false, - "options": [] } ] \ No newline at end of file diff --git a/test/snap/__snapshots__/csr.test.jsx.snap b/test/snap/__snapshots__/csr.test.jsx.snap index 93db52dd19..08d212ee13 100644 --- a/test/snap/__snapshots__/csr.test.jsx.snap +++ b/test/snap/__snapshots__/csr.test.jsx.snap @@ -43610,104 +43610,49 @@ exports[`csr snapshot test > csr test packages/components/dialog/_example/icon.t exports[`csr snapshot test > csr test packages/components/dialog/_example/modal.tsx 1`] = `
- - -
-
- 普通对话框 -
- - - - - - - -
-
-

- This is a dialog -

+ 非模态对话框(可拖拽) + +
+
@@ -149916,7 +149861,7 @@ exports[`ssr snapshot test > ssr test packages/components/dialog/_example/custom exports[`ssr snapshot test > ssr test packages/components/dialog/_example/icon.tsx 1`] = `""`; -exports[`ssr snapshot test > ssr test packages/components/dialog/_example/modal.tsx 1`] = `"
普通对话框

This is a dialog

"`; +exports[`ssr snapshot test > ssr test packages/components/dialog/_example/modal.tsx 1`] = `"
"`; exports[`ssr snapshot test > ssr test packages/components/dialog/_example/plugin.tsx 1`] = `"

函数调用方式一:DialogPlugin(options)

函数调用方式二:DialogPlugin.confirm(options)

函数调用方式三:DialogPlugin.alert(options)

"`; diff --git a/test/snap/__snapshots__/ssr.test.jsx.snap b/test/snap/__snapshots__/ssr.test.jsx.snap index 090c831883..6544bf898e 100644 --- a/test/snap/__snapshots__/ssr.test.jsx.snap +++ b/test/snap/__snapshots__/ssr.test.jsx.snap @@ -340,7 +340,7 @@ exports[`ssr snapshot test > ssr test packages/components/dialog/_example/custom exports[`ssr snapshot test > ssr test packages/components/dialog/_example/icon.tsx 1`] = `""`; -exports[`ssr snapshot test > ssr test packages/components/dialog/_example/modal.tsx 1`] = `"
普通对话框

This is a dialog

"`; +exports[`ssr snapshot test > ssr test packages/components/dialog/_example/modal.tsx 1`] = `"
"`; exports[`ssr snapshot test > ssr test packages/components/dialog/_example/plugin.tsx 1`] = `"

函数调用方式一:DialogPlugin(options)

函数调用方式二:DialogPlugin.confirm(options)

函数调用方式三:DialogPlugin.alert(options)

"`;