From 92248806e908a1ce32c6f554fd9844ab80867e47 Mon Sep 17 00:00:00 2001 From: lijianan <574980606@qq.com> Date: Tue, 6 May 2025 19:02:01 +0800 Subject: [PATCH] refactor: Unified destroyOnHidden API (#53739) * refactor: Unified destroyOnHidden API * fix: fix type * fix: fix type * fix: fix * fix: fix * fix: fix * doc: update doc * doc: update doc * demo: update demo --- .cursor/rules/naming.mdc | 18 ++++----- .../builtins/ComponentTokenTable/index.tsx | 2 +- .../ComponentChangelog/ComponentChangelog.tsx | 4 +- .dumi/theme/slots/Header/index.tsx | 2 +- components/avatar/AvatarGroup.tsx | 2 +- components/collapse/Collapse.tsx | 14 +++++++ components/collapse/index.en-US.md | 3 +- components/collapse/index.zh-CN.md | 3 +- components/color-picker/ColorPicker.tsx | 4 +- components/color-picker/index.en-US.md | 2 +- components/color-picker/index.zh-CN.md | 2 +- components/color-picker/interface.ts | 2 +- components/drawer/__tests__/Drawer.test.tsx | 6 +-- .../drawer/__tests__/DrawerEvent.test.tsx | 8 ++-- .../__snapshots__/Drawer.test.tsx.snap | 2 +- components/drawer/demo/loading.tsx | 2 +- components/drawer/index.en-US.md | 3 +- components/drawer/index.tsx | 14 ++++++- components/drawer/index.zh-CN.md | 3 +- .../__tests__/dropdown-button.test.tsx | 2 +- components/dropdown/__tests__/index.test.tsx | 2 +- components/dropdown/dropdown-button.tsx | 4 +- components/dropdown/dropdown.tsx | 10 ++--- components/dropdown/index.en-US.md | 4 +- components/dropdown/index.zh-CN.md | 4 +- components/form/demo/form-in-modal.tsx | 2 +- components/image/demo/imageRender.tsx | 2 +- components/image/index.en-US.md | 3 +- components/image/index.tsx | 39 +++++++++++++++++-- components/image/index.zh-CN.md | 3 +- components/modal/Modal.tsx | 5 +++ components/modal/demo/nested.tsx | 6 +-- components/modal/index.en-US.md | 7 ++-- components/modal/index.zh-CN.md | 7 ++-- components/modal/interface.ts | 5 +++ components/tabs/index.en-US.md | 3 +- components/tabs/index.tsx | 19 ++++++++- components/tabs/index.zh-CN.md | 3 +- components/tooltip/__tests__/tooltip.test.tsx | 2 +- components/tooltip/demo/destroy-on-close.md | 4 +- components/tooltip/demo/destroy-on-close.tsx | 2 +- components/tooltip/index.tsx | 12 +++--- .../tooltip/shared/sharedProps.en-US.md | 2 +- .../tooltip/shared/sharedProps.zh-CN.md | 2 +- components/watermark/demo/portal.tsx | 6 +-- 45 files changed, 175 insertions(+), 81 deletions(-) diff --git a/.cursor/rules/naming.mdc b/.cursor/rules/naming.mdc index fcf8c01203..4e9036a983 100644 --- a/.cursor/rules/naming.mdc +++ b/.cursor/rules/naming.mdc @@ -1,6 +1,6 @@ --- -description: -globs: +description: +globs: alwaysApply: true --- Basically, antd naming requires **FULL NAME** instead of Abbreviation. @@ -31,7 +31,7 @@ Basically, antd naming requires **FULL NAME** instead of Abbreviation. * Multiple icons: `FunctionName` + `Icon` * Trigger: `trigger` * Sub function trigger: `Sub Function` + `Trigger` - * Trigger on the time point: `xxx` + `On` + `EventName` (e.g. `destroyOnClose`) + * Trigger on the time point: `xxx` + `On` + `EventName` (e.g. `destroyOnHidden`) * Component use other component config. Naming as component.(e.g. ``) * ClassName: `className` * Additional classes should be merged into `classes` (e.g. `Loading Drawer

} placement="right" open={open} diff --git a/components/drawer/index.en-US.md b/components/drawer/index.en-US.md index 531a7a9a1b..0f0a44540c 100644 --- a/components/drawer/index.en-US.md +++ b/components/drawer/index.en-US.md @@ -56,7 +56,8 @@ v5 uses `rootClassName` & `rootStyle` to configure the outermost element style, | className | Config Drawer Panel className. Use `rootClassName` if want to config top DOM style | string | - | | | classNames | Semantic structure className | [Record](#semantic-dom) | - | 5.10.0 | | closeIcon | Custom close icon. 5.7.0: close button will be hidden when setting to `null` or `false` | ReactNode | <CloseOutlined /> | | -| destroyOnClose | Whether to unmount child components on closing drawer or not | boolean | false | | +| ~~destroyOnClose~~ | Whether to unmount child components on closing drawer or not | boolean | false | | +| destroyOnHidden | Whether to unmount child components on closing drawer or not | boolean | false | 5.25.0 | | extra | Extra actions area at corner | ReactNode | - | 4.17.0 | | footer | The footer for Drawer | ReactNode | - | | | forceRender | Pre-render Drawer component forcibly | boolean | false | | diff --git a/components/drawer/index.tsx b/components/drawer/index.tsx index 83fabf818d..38458487e8 100644 --- a/components/drawer/index.tsx +++ b/components/drawer/index.tsx @@ -26,7 +26,7 @@ export interface PushState { // Drawer diff props: 'open' | 'motion' | 'maskMotion' | 'wrapperClassName' export interface DrawerProps - extends Omit, + extends Omit, Omit { size?: sizeType; @@ -41,6 +41,12 @@ export interface DrawerProps afterVisibleChange?: (open: boolean) => void; classNames?: DrawerClassNames; styles?: DrawerStyles; + /** @deprecated Please use `destroyOnHidden` instead */ + destroyOnClose?: boolean; + /** + * @since 5.25.0 + */ + destroyOnHidden?: boolean; } const defaultPushState: PushState = { distance: 180 }; @@ -69,7 +75,8 @@ const Drawer: React.FC & { maskStyle, drawerStyle, contentWrapperStyle, - + destroyOnClose, + destroyOnHidden, ...rest } = props; @@ -116,6 +123,7 @@ const Drawer: React.FC & { ['contentWrapperStyle', 'styles.wrapper'], ['maskStyle', 'styles.mask'], ['drawerStyle', 'styles.content'], + ['destroyInactivePanel', 'destroyOnHidden'], ].forEach(([deprecatedName, newName]) => { warning.deprecated(!(deprecatedName in props), deprecatedName, newName); }); @@ -210,6 +218,8 @@ const Drawer: React.FC & { afterOpenChange={afterOpenChange ?? afterVisibleChange} panelRef={panelRef} zIndex={zIndex} + // TODO: In the future, destroyOnClose in rc-drawer needs to be upgrade to destroyOnHidden + destroyOnClose={destroyOnHidden ?? destroyOnClose} > diff --git a/components/drawer/index.zh-CN.md b/components/drawer/index.zh-CN.md index dfdfebfe51..88c3faeac8 100644 --- a/components/drawer/index.zh-CN.md +++ b/components/drawer/index.zh-CN.md @@ -56,7 +56,8 @@ v5 使用 `rootClassName` 与 `rootStyle` 来配置最外层元素样式。原 v | className | Drawer 容器外层 className 设置,如果需要设置最外层,请使用 rootClassName | string | - | | | classNames | 语义化结构 className | [Record](#semantic-dom) | - | 5.10.0 | | closeIcon | 自定义关闭图标。5.7.0:设置为 `null` 或 `false` 时隐藏关闭按钮 | ReactNode | <CloseOutlined /> | | -| destroyOnClose | 关闭时销毁 Drawer 里的子元素 | boolean | false | | +| ~~destroyOnClose~~ | 关闭时销毁 Drawer 里的子元素 | boolean | false | | +| destroyOnHidden | 关闭时销毁 Drawer 里的子元素 | boolean | false | 5.25.0 | | extra | 抽屉右上角的操作区域 | ReactNode | - | 4.17.0 | | footer | 抽屉的页脚 | ReactNode | - | | | forceRender | 预渲染 Drawer 内元素 | boolean | false | | diff --git a/components/dropdown/__tests__/dropdown-button.test.tsx b/components/dropdown/__tests__/dropdown-button.test.tsx index 41f48d6374..ec8eae84c3 100644 --- a/components/dropdown/__tests__/dropdown-button.test.tsx +++ b/components/dropdown/__tests__/dropdown-button.test.tsx @@ -181,7 +181,7 @@ describe('DropdownButton', () => { , ); expect(errorSpy).toHaveBeenCalledWith( - 'Warning: [antd: Dropdown] `destroyPopupOnHide` is deprecated. Please use `destroyOnClose` instead.', + 'Warning: [antd: Dropdown] `destroyPopupOnHide` is deprecated. Please use `destroyOnHidden` instead.', ); errorSpy.mockRestore(); }); diff --git a/components/dropdown/__tests__/index.test.tsx b/components/dropdown/__tests__/index.test.tsx index 68b0f65df9..0ae53b6d64 100644 --- a/components/dropdown/__tests__/index.test.tsx +++ b/components/dropdown/__tests__/index.test.tsx @@ -291,7 +291,7 @@ describe('Dropdown', () => { 'Warning: [antd: Dropdown] `dropdownRender` is deprecated. Please use `popupRender` instead.', ); expect(errorSpy).toHaveBeenCalledWith( - 'Warning: [antd: Dropdown] `destroyPopupOnHide` is deprecated. Please use `destroyOnClose` instead.', + 'Warning: [antd: Dropdown] `destroyPopupOnHide` is deprecated. Please use `destroyOnHidden` instead.', ); expect(dropdownRender).toHaveBeenCalled(); diff --git a/components/dropdown/dropdown-button.tsx b/components/dropdown/dropdown-button.tsx index 1b7120d203..2b77b6bb7d 100644 --- a/components/dropdown/dropdown-button.tsx +++ b/components/dropdown/dropdown-button.tsx @@ -67,7 +67,7 @@ const DropdownButton: CompoundedComponent = (props) => { mouseLeaveDelay, overlayClassName, overlayStyle, - destroyOnClose, + destroyOnHidden, destroyPopupOnHide, dropdownRender, popupRender, @@ -92,7 +92,7 @@ const DropdownButton: CompoundedComponent = (props) => { mouseLeaveDelay, overlayClassName, overlayStyle, - destroyOnClose, + destroyOnHidden, popupRender: mergedPopupRender, }; diff --git a/components/dropdown/dropdown.tsx b/components/dropdown/dropdown.tsx index db7c189e57..68998844c0 100644 --- a/components/dropdown/dropdown.tsx +++ b/components/dropdown/dropdown.tsx @@ -55,12 +55,12 @@ export interface DropdownProps { onOpenChange?: (open: boolean, info: { source: 'trigger' | 'menu' }) => void; open?: boolean; disabled?: boolean; - /** @deprecated Please use `destroyOnClose` instead */ + /** @deprecated Please use `destroyOnHidden` instead */ destroyPopupOnHide?: boolean; /** * @since 5.25.0 */ - destroyOnClose?: boolean; + destroyOnHidden?: boolean; align?: AlignType; getPopupContainer?: (triggerNode: HTMLElement) => HTMLElement; prefixCls?: string; @@ -115,7 +115,7 @@ const Dropdown: CompoundedComponent = (props) => { placement = '', overlay, transitionName, - destroyOnClose, + destroyOnHidden, destroyPopupOnHide, } = props; @@ -137,7 +137,7 @@ const Dropdown: CompoundedComponent = (props) => { onVisibleChange: 'onOpenChange', overlay: 'menu', dropdownRender: 'popupRender', - destroyPopupOnHide: 'destroyOnClose', + destroyPopupOnHide: 'destroyOnHidden', }; Object.entries(deprecatedProps).forEach(([deprecatedName, newName]) => { @@ -311,7 +311,7 @@ const Dropdown: CompoundedComponent = (props) => { placement={memoPlacement} onVisibleChange={onInnerOpenChange} overlayStyle={{ ...dropdown?.style, ...overlayStyle, zIndex }} - autoDestroy={destroyOnClose ?? destroyPopupOnHide} + autoDestroy={destroyOnHidden ?? destroyPopupOnHide} > {popupTrigger} diff --git a/components/dropdown/index.en-US.md b/components/dropdown/index.en-US.md index 6d55abfa4b..1f4389f00b 100644 --- a/components/dropdown/index.en-US.md +++ b/components/dropdown/index.en-US.md @@ -48,8 +48,8 @@ Common props ref:[Common props](/docs/react/common-props) | autoAdjustOverflow | Whether to adjust dropdown placement automatically when dropdown is off screen | boolean | true | 5.2.0 | | autoFocus | Focus element in `overlay` when opened | boolean | false | 4.21.0 | | disabled | Whether the dropdown menu is disabled | boolean | - | | -| ~~destroyPopupOnHide~~ | Whether destroy dropdown when hidden, use `destroyOnClose` instead | boolean | false | | -| destroyOnClose | Whether destroy dropdown when hidden | boolean | false | 5.25.0 | +| ~~destroyPopupOnHide~~ | Whether destroy dropdown when hidden, use `destroyOnHidden` instead | boolean | false | | +| destroyOnHidden | Whether destroy dropdown when hidden | boolean | false | 5.25.0 | | ~~dropdownRender~~ | Customize dropdown content, use `popupRender` instead | (menus: ReactNode) => ReactNode | - | 4.24.0 | | popupRender | Customize popup content | (menus: ReactNode) => ReactNode | - | 5.25.0 | | getPopupContainer | To set the container of the dropdown menu. The default is to create a div element in body, but you can reset it to the scrolling area and make a relative reposition. [Example on CodePen](https://codepen.io/afc163/pen/zEjNOy?editors=0010) | (triggerNode: HTMLElement) => HTMLElement | () => document.body | | diff --git a/components/dropdown/index.zh-CN.md b/components/dropdown/index.zh-CN.md index a58226183e..b5a8a6074a 100644 --- a/components/dropdown/index.zh-CN.md +++ b/components/dropdown/index.zh-CN.md @@ -52,8 +52,8 @@ demo: | autoAdjustOverflow | 下拉框被遮挡时自动调整位置 | boolean | true | 5.2.0 | | autoFocus | 打开后自动聚焦下拉框 | boolean | false | 4.21.0 | | disabled | 菜单是否禁用 | boolean | - | | -| ~~destroyPopupOnHide~~ | 关闭后是否销毁 Dropdown,使用 `destroyOnClose` 替换 | boolean | false | | -| destroyOnClose | 关闭后是否销毁 Dropdown | boolean | false | 5.25.0 | +| ~~destroyPopupOnHide~~ | 关闭后是否销毁 Dropdown,使用 `destroyOnHidden` 替换 | boolean | false | | +| destroyOnHidden | 关闭后是否销毁 Dropdown | boolean | false | 5.25.0 | | ~~dropdownRender~~ | 自定义下拉框内容,使用 `popupRender` 替换 | (menus: ReactNode) => ReactNode | - | 4.24.0 | | popupRender | 自定义弹出框内容 | (menus: ReactNode) => ReactNode | - | 5.25.0 | | getPopupContainer | 菜单渲染父节点。默认渲染到 body 上,如果你遇到菜单滚动定位问题,试试修改为滚动的区域,并相对其定位。[示例](https://codepen.io/afc163/pen/zEjNOy?editors=0010) | (triggerNode: HTMLElement) => HTMLElement | () => document.body | | diff --git a/components/form/demo/form-in-modal.tsx b/components/form/demo/form-in-modal.tsx index fb7fe1e68b..67505c7841 100644 --- a/components/form/demo/form-in-modal.tsx +++ b/components/form/demo/form-in-modal.tsx @@ -31,7 +31,7 @@ const App: React.FC = () => { cancelText="Cancel" okButtonProps={{ autoFocus: true, htmlType: 'submit' }} onCancel={() => setOpen(false)} - destroyOnClose + destroyOnHidden modalRender={(dom) => (
( (