Skip to content

Commit 94fb671

Browse files
authored
feat: add fresh (#424)
* docs: update demo * docs: move out * test: add test case
1 parent 62826a1 commit 94fb671

File tree

4 files changed

+92
-39
lines changed

4 files changed

+92
-39
lines changed

docs/examples/click-nested.tsx

Lines changed: 52 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -37,44 +37,58 @@ const popupBorderStyle = {
3737
background: 'rgba(255, 0, 0, 0.1)',
3838
};
3939

40-
class Test extends React.Component {
41-
render() {
42-
return (
43-
<div style={{ margin: 200 }}>
44-
<div>
45-
<Trigger
46-
popupPlacement="right"
47-
action={['click']}
48-
builtinPlacements={builtinPlacements}
49-
popup={
50-
// Level 2
51-
<Trigger
52-
popupPlacement="right"
53-
action={['click']}
54-
builtinPlacements={builtinPlacements}
55-
popup={<div style={popupBorderStyle}>i am a click popup</div>}
56-
>
57-
<div style={popupBorderStyle}>
58-
i am a click popup{' '}
59-
<button
60-
type="button"
61-
onMouseDown={(e) => {
62-
e.stopPropagation();
63-
e.preventDefault();
64-
}}
65-
>
66-
I am preventPop
67-
</button>
68-
</div>
69-
</Trigger>
70-
}
71-
>
72-
<span>Click Me</span>
73-
</Trigger>
74-
</div>
40+
const NestPopup = ({ open, setOpen }) => {
41+
return (
42+
<Trigger
43+
popupPlacement="right"
44+
action={['click']}
45+
builtinPlacements={builtinPlacements}
46+
popup={<div style={popupBorderStyle}>i am a click popup</div>}
47+
popupVisible={open}
48+
onPopupVisibleChange={setOpen}
49+
>
50+
<div style={popupBorderStyle}>
51+
i am a click popup{' '}
52+
<button
53+
type="button"
54+
onClick={(e) => {
55+
e.stopPropagation();
56+
e.preventDefault();
57+
}}
58+
>
59+
I am preventPop
60+
</button>
7561
</div>
76-
);
77-
}
78-
}
62+
</Trigger>
63+
);
64+
};
65+
66+
NestPopup.displayName = '🐞 NestPopup';
67+
68+
const Test = () => {
69+
const [open1, setOpen1] = React.useState(false);
70+
const [open2, setOpen2] = React.useState(false);
71+
72+
return (
73+
<div style={{ margin: 200 }}>
74+
<div>
75+
<Trigger
76+
popupPlacement="right"
77+
action={['click']}
78+
builtinPlacements={builtinPlacements}
79+
popupVisible={open1}
80+
onPopupVisibleChange={setOpen1}
81+
popup={
82+
// Level 2
83+
<NestPopup open={open2} setOpen={setOpen2} />
84+
}
85+
fresh
86+
>
87+
<span>Click Me</span>
88+
</Trigger>
89+
</div>
90+
</div>
91+
);
92+
};
7993

8094
export default Test;

src/Popup/index.tsx

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ export interface PopupProps {
3434
open: boolean;
3535
/** Tell Portal that should keep in screen. e.g. should wait all motion end */
3636
keepDom: boolean;
37+
fresh?: boolean;
3738

3839
// Click
3940
onClick?: React.MouseEventHandler<HTMLDivElement>;
@@ -76,6 +77,7 @@ const Popup = React.forwardRef<HTMLDivElement, PopupProps>((props, ref) => {
7677
// Open
7778
open,
7879
keepDom,
80+
fresh,
7981

8082
// Click
8183
onClick,
@@ -262,7 +264,9 @@ const Popup = React.forwardRef<HTMLDivElement, PopupProps>((props, ref) => {
262264
align={align}
263265
/>
264266
)}
265-
<PopupContent cache={!open}>{childNode}</PopupContent>
267+
<PopupContent cache={!open && !fresh}>
268+
{childNode}
269+
</PopupContent>
266270
</div>
267271
);
268272
}}

src/index.tsx

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,13 @@ export interface TriggerProps {
112112

113113
alignPoint?: boolean; // Maybe we can support user pass position in the future
114114

115+
/**
116+
* Trigger will memo content when close.
117+
* This may affect the case if want to keep content update.
118+
* Set `fresh` to `false` will always keep update.
119+
*/
120+
fresh?: boolean;
121+
115122
// ==================== Arrow ====================
116123
arrow?: boolean | ArrowTypeOuter;
117124

@@ -179,6 +186,7 @@ export function generateTrigger(
179186
zIndex,
180187
stretch,
181188
getPopupClassNameFromAlign,
189+
fresh,
182190

183191
alignPoint,
184192

@@ -687,6 +695,7 @@ export function generateTrigger(
687695
// Open
688696
open={mergedOpen}
689697
keepDom={inMotion}
698+
fresh={fresh}
690699
// Click
691700
onClick={onPopupClick}
692701
// Mask

tests/basic.test.jsx

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1165,4 +1165,30 @@ describe('Trigger.Basic', () => {
11651165
trigger(container, '.popup', 'mouseEnter');
11661166
expect(onPopupVisibleChange).not.toHaveBeenCalled();
11671167
});
1168+
1169+
// https://gith(ub.com/ant-design/ant-design/issues/44830
1170+
it('fresh should work', () => {
1171+
const Demo = () => {
1172+
const [open, setOpen] = React.useState(true);
1173+
1174+
return (
1175+
<Trigger
1176+
popupVisible={open}
1177+
onPopupVisibleChange={setOpen}
1178+
popup={<strong className="x-content">{String(open)}</strong>}
1179+
action={['click']}
1180+
popupAlign={placementAlignMap.left}
1181+
fresh
1182+
>
1183+
<div className="target">click</div>
1184+
</Trigger>
1185+
);
1186+
};
1187+
1188+
const { container } = render(<Demo />);
1189+
expect(document.querySelector('.x-content').textContent).toBe('true');
1190+
1191+
trigger(container, '.target');
1192+
expect(document.querySelector('.x-content').textContent).toBe('false');
1193+
});
11681194
});

0 commit comments

Comments
 (0)