Skip to content

Commit 57541aa

Browse files
authored
chore: adjust open order (#1169)
1 parent 208c66a commit 57541aa

File tree

2 files changed

+29
-15
lines changed

2 files changed

+29
-15
lines changed

src/BaseSelect/index.tsx

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -570,7 +570,9 @@ const BaseSelect = React.forwardRef<BaseSelectRef, BaseSelectProps>((props, ref)
570570
}
571571

572572
if (!disabled) {
573-
triggerOpen(false);
573+
triggerOpen(false, {
574+
lazy: true,
575+
});
574576
onBlur?.(event);
575577
}
576578
};
@@ -582,7 +584,9 @@ const BaseSelect = React.forwardRef<BaseSelectRef, BaseSelectProps>((props, ref)
582584
// We should give focus back to selector if clicked item is not focusable
583585
if (popupElement?.contains(target as HTMLElement) && triggerOpen) {
584586
// Tell `open` not to close since it's safe in the popup
585-
triggerOpen(true, true);
587+
triggerOpen(true, {
588+
ignoreNext: true,
589+
});
586590
}
587591

588592
onMouseDown?.(event, ...restArgs);

src/hooks/useOpen.ts

Lines changed: 23 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,13 @@ const macroTask = (fn: VoidFunction, times = 1) => {
2222
* Trigger by latest open call, if nextOpen is undefined, means toggle.
2323
* ignoreNext will skip next call in the macro task queue.
2424
*/
25-
export type TriggerOpenType = (nextOpen?: boolean, ignoreNext?: boolean) => void;
25+
export type TriggerOpenType = (
26+
nextOpen?: boolean,
27+
config?: {
28+
ignoreNext?: boolean;
29+
lazy?: boolean;
30+
},
31+
) => void;
2632

2733
/**
2834
* When `open` is controlled, follow the controlled value;
@@ -61,30 +67,34 @@ export default function useOpen(
6167
internalSetOpen(nextOpen);
6268
});
6369

64-
const toggleOpen = useEvent<TriggerOpenType>((nextOpen?: boolean, ignoreNext = false) => {
70+
const toggleOpen = useEvent<TriggerOpenType>((nextOpen, config = {}) => {
71+
const { ignoreNext = false, lazy = false } = config;
72+
6573
taskIdRef.current += 1;
6674
const id = taskIdRef.current;
6775

6876
const nextOpenVal = typeof nextOpen === 'boolean' ? nextOpen : !mergedOpen;
6977

7078
// Since `mergedOpen` is post-processed, we need to check if the value really changed
71-
if (nextOpenVal) {
72-
triggerEvent(true);
73-
74-
// Lock if needed
75-
if (ignoreNext) {
76-
taskLockRef.current = ignoreNext;
77-
78-
macroTask(() => {
79-
taskLockRef.current = false;
80-
}, 2);
79+
if (nextOpenVal || !lazy) {
80+
if (!taskLockRef.current) {
81+
triggerEvent(nextOpenVal);
82+
83+
// Lock if needed
84+
if (ignoreNext) {
85+
taskLockRef.current = ignoreNext;
86+
87+
macroTask(() => {
88+
taskLockRef.current = false;
89+
}, 2);
90+
}
8191
}
8292
return;
8393
}
8494

8595
macroTask(() => {
8696
if (id === taskIdRef.current && !taskLockRef.current) {
87-
triggerEvent(false);
97+
triggerEvent(nextOpenVal);
8898
}
8999
});
90100
});

0 commit comments

Comments
 (0)