Skip to content

Commit 3169f90

Browse files
committed
feat: Cache popup children when closed
1 parent bccc332 commit 3169f90

File tree

2 files changed

+37
-8
lines changed

2 files changed

+37
-8
lines changed

src/PopupContainer.tsx

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import * as React from 'react';
2+
3+
export interface PopupContainerProps {
4+
children: React.ReactElement;
5+
visible: boolean;
6+
dropdownRender?: (menu: React.ReactElement) => React.ReactElement;
7+
}
8+
9+
const PopupContainer = React.memo<PopupContainerProps>(
10+
({ children }) => children,
11+
(_, { dropdownRender, visible }) => !dropdownRender && !visible,
12+
);
13+
14+
PopupContainer.displayName = 'PopupContainer';
15+
16+
export default PopupContainer;

src/SelectTrigger.tsx

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import * as React from 'react';
22
import Trigger from 'rc-trigger';
33
import classNames from 'classnames';
44
import { RenderDOMFunc } from './interface';
5+
import PopupContainer from './PopupContainer';
56

67
const BUILT_IN_PLACEMENTS = {
78
bottomLeft: {
@@ -47,10 +48,10 @@ export interface SelectTriggerProps {
4748
getTriggerDOMNode: () => HTMLElement;
4849
}
4950

50-
const SelectTrigger: React.RefForwardingComponent<RefTriggerProps, SelectTriggerProps> = (
51-
props,
52-
ref,
53-
) => {
51+
const SelectTrigger: React.RefForwardingComponent<
52+
RefTriggerProps,
53+
SelectTriggerProps
54+
> = (props, ref) => {
5455
const {
5556
prefixCls,
5657
disabled,
@@ -79,7 +80,9 @@ const SelectTrigger: React.RefForwardingComponent<RefTriggerProps, SelectTrigger
7980
}
8081

8182
// ===================== Motion ======================
82-
const mergedTransitionName = animation ? `${dropdownPrefixCls}-${animation}` : transitionName;
83+
const mergedTransitionName = animation
84+
? `${dropdownPrefixCls}-${animation}`
85+
: transitionName;
8386

8487
// ======================= Ref =======================
8588
const popupRef = React.useRef<HTMLDivElement>(null);
@@ -97,7 +100,13 @@ const SelectTrigger: React.RefForwardingComponent<RefTriggerProps, SelectTrigger
97100
builtinPlacements={BUILT_IN_PLACEMENTS}
98101
prefixCls={dropdownPrefixCls}
99102
popupTransitionName={mergedTransitionName}
100-
popup={<div ref={popupRef}>{popupNode}</div>}
103+
popup={
104+
<div ref={popupRef}>
105+
<PopupContainer visible={visible} dropdownRender={dropdownRender}>
106+
{popupNode}
107+
</PopupContainer>
108+
</div>
109+
}
101110
popupAlign={dropdownAlign}
102111
popupVisible={visible}
103112
getPopupContainer={getPopupContainer}
@@ -107,7 +116,9 @@ const SelectTrigger: React.RefForwardingComponent<RefTriggerProps, SelectTrigger
107116
popupStyle={{
108117
...dropdownStyle,
109118
width:
110-
typeof dropdownMatchSelectWidth === 'number' ? dropdownMatchSelectWidth : containerWidth,
119+
typeof dropdownMatchSelectWidth === 'number'
120+
? dropdownMatchSelectWidth
121+
: containerWidth,
111122
}}
112123
getTriggerDOMNode={getTriggerDOMNode}
113124
>
@@ -116,7 +127,9 @@ const SelectTrigger: React.RefForwardingComponent<RefTriggerProps, SelectTrigger
116127
);
117128
};
118129

119-
const RefSelectTrigger = React.forwardRef<RefTriggerProps, SelectTriggerProps>(SelectTrigger);
130+
const RefSelectTrigger = React.forwardRef<RefTriggerProps, SelectTriggerProps>(
131+
SelectTrigger,
132+
);
120133
RefSelectTrigger.displayName = 'SelectTrigger';
121134

122135
export default RefSelectTrigger;

0 commit comments

Comments
 (0)