Skip to content

Commit fa4407b

Browse files
committed
chore: adjust
1 parent 1cffebd commit fa4407b

File tree

5 files changed

+22
-17
lines changed

5 files changed

+22
-17
lines changed

src/BaseSelect/index.tsx

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -564,13 +564,12 @@ const BaseSelect = React.forwardRef<BaseSelectRef, BaseSelectProps>((props, ref)
564564
};
565565

566566
const onRootBlur = () => {
567-
macroTask(() => {
568-
if (!isInside(getSelectElements(), document.activeElement as HTMLElement)) {
569-
triggerOpen(false, {
570-
weak: true,
571-
});
572-
}
573-
});
567+
// Delay close should check the activeElement
568+
if (mergedOpen) {
569+
triggerOpen(false, {
570+
cancelFun: () => isInside(getSelectElements(), document.activeElement as HTMLElement),
571+
});
572+
}
574573
};
575574

576575
const onInternalBlur: React.FocusEventHandler<HTMLElement> = (event) => {

src/SelectInput/index.tsx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -170,13 +170,14 @@ export default React.forwardRef<SelectInputRef, SelectInputProps>(function Selec
170170
// ====================== Open ======================
171171
const onInternalMouseDown: SelectInputProps['onMouseDown'] = useEvent((event) => {
172172
if (!disabled) {
173+
const inputDOM = getDOM(inputRef.current);
174+
173175
// https://github.com/ant-design/ant-design/issues/56002
174176
// Tell `useSelectTriggerControl` to ignore this event
175177
// When icon is dynamic render, the parentNode will miss
176178
// so we need to mark the event directly
177-
(event.nativeEvent as any)._ignore_global_close = true;
179+
(event.nativeEvent as any)._ori_target = inputDOM;
178180

179-
const inputDOM = getDOM(inputRef.current);
180181
if (inputDOM && event.target !== inputDOM && !inputDOM.contains(event.target as Node)) {
181182
event.preventDefault();
182183
}

src/hooks/useOpen.ts

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ export type TriggerOpenType = (
2626
nextOpen?: boolean,
2727
config?: {
2828
weak?: boolean;
29+
cancelFun?: () => boolean;
2930
},
3031
) => void;
3132

@@ -67,7 +68,7 @@ export default function useOpen(
6768
});
6869

6970
const toggleOpen = useEvent<TriggerOpenType>((nextOpen, config = {}) => {
70-
const { weak = false } = config;
71+
const { weak = false, cancelFun } = config;
7172

7273
taskIdRef.current += 1;
7374
const id = taskIdRef.current;
@@ -79,17 +80,18 @@ export default function useOpen(
7980
// Always check if id is match
8081
id === taskIdRef.current &&
8182
// Only weak update when not locked
82-
(!weak || !weakLockRef.current)
83+
(!weak || !weakLockRef.current) &&
84+
// Check if need to cancel
85+
!cancelFun?.()
8386
) {
8487
triggerEvent(nextOpenVal);
85-
weakLockRef.current = false;
8688
}
8789
}
8890

8991
// Since `mergedOpen` is post-processed, we need to check if the value really changed
9092
if (!weak) {
9193
// Only `true` need lock
92-
weakLockRef.current = nextOpenVal;
94+
weakLockRef.current = true;
9395
}
9496

9597
// Weak update can be ignored
@@ -98,6 +100,7 @@ export default function useOpen(
98100
} else {
99101
macroTask(() => {
100102
triggerUpdate();
103+
weakLockRef.current = false;
101104
});
102105
}
103106
});

src/hooks/useSelectTriggerControl.ts

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,16 +26,17 @@ export default function useSelectTriggerControl(
2626
target = (event.composedPath()[0] || target) as HTMLElement;
2727
}
2828

29+
if ((event as any)._ori_target) {
30+
target = (event as any)._ori_target;
31+
}
32+
2933
if (
3034
open &&
3135
// Marked by SelectInput mouseDown event
32-
!(event as any)._ignore_global_close &&
3336
!isInside(elements(), target)
3437
) {
3538
// Should trigger close
36-
triggerOpen(false, {
37-
weak: true,
38-
});
39+
triggerOpen(false);
3940
}
4041
});
4142

tests/Select.test.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1951,6 +1951,7 @@ describe('Select.Basic', () => {
19511951

19521952
toggleOpen(container);
19531953

1954+
console.log('!~~~~~~~~');
19541955
const clickEvent = new Event('mousedown');
19551956
Object.defineProperty(clickEvent, 'target', {
19561957
get: () => document.body,

0 commit comments

Comments
 (0)