Skip to content

Commit e728820

Browse files
committed
enhance: support filter not change
1 parent d1aeb03 commit e728820

File tree

4 files changed

+15
-5
lines changed

4 files changed

+15
-5
lines changed

src/BaseSelect/index.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -362,7 +362,7 @@ const BaseSelect = React.forwardRef<BaseSelectRef, BaseSelectProps>((props, ref)
362362
// Not trigger `open` when `notFoundContent` is empty
363363
const emptyListContent = !notFoundContent && emptyOptions;
364364

365-
const [mergedOpen, triggerOpen] = useOpen(
365+
const [mergedOpen, triggerOpen, lockOptions] = useOpen(
366366
defaultOpen || false,
367367
open,
368368
onPopupVisibleChange,
@@ -647,6 +647,7 @@ const BaseSelect = React.forwardRef<BaseSelectRef, BaseSelectProps>((props, ref)
647647
showScrollBar,
648648
styles,
649649
classNames,
650+
lockOptions,
650651
}),
651652
[
652653
props,
@@ -659,6 +660,7 @@ const BaseSelect = React.forwardRef<BaseSelectRef, BaseSelectProps>((props, ref)
659660
showScrollBar,
660661
styles,
661662
classNames,
663+
lockOptions,
662664
],
663665
);
664666

src/OptionList.tsx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ const OptionList: React.ForwardRefRenderFunction<RefOptionListProps, {}> = (_, r
4545
notFoundContent,
4646
onPopupScroll,
4747
showScrollBar,
48+
lockOptions,
4849
} = useBaseProps();
4950
const {
5051
maxCount,
@@ -68,8 +69,8 @@ const OptionList: React.ForwardRefRenderFunction<RefOptionListProps, {}> = (_, r
6869

6970
const memoFlattenOptions = useMemo(
7071
() => flattenOptions,
71-
[open, flattenOptions],
72-
(prev, next) => next[0] && prev[1] !== next[1],
72+
[open, lockOptions],
73+
(prev, next) => next[0] && !next[1],
7374
);
7475

7576
// =========================== List ===========================

src/hooks/useBaseProps.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ export interface BaseSelectContextProps extends BaseSelectProps {
1010
triggerOpen: boolean;
1111
multiple: boolean;
1212
toggleOpen: (open?: boolean) => void;
13+
lockOptions: boolean;
1314
}
1415

1516
export const BaseSelectContext = React.createContext<BaseSelectContextProps>(null);

src/hooks/useOpen.ts

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ export default function useOpen(
4343
propOpen: boolean,
4444
onOpen: (nextOpen: boolean) => void,
4545
postOpen: (nextOpen: boolean) => boolean,
46-
): [boolean, TriggerOpenType] {
46+
): [open: boolean, toggleOpen: TriggerOpenType, lockOptions: boolean] {
4747
// SSR not support Portal which means we need delay `open` for the first time render
4848
const [rendered, setRendered] = useState(false);
4949

@@ -53,6 +53,9 @@ export default function useOpen(
5353

5454
const [stateOpen, internalSetOpen] = useControlledState(defaultOpen, propOpen);
5555

56+
// Lock for options update
57+
const [lock, setLock] = useState(false);
58+
5659
// During SSR, always return false for open state
5760
const ssrSafeOpen = rendered ? stateOpen : false;
5861
const mergedOpen = postOpen(ssrSafeOpen);
@@ -70,9 +73,11 @@ export default function useOpen(
7073
const { cancelFun } = config;
7174

7275
taskIdRef.current += 1;
76+
7377
const id = taskIdRef.current;
7478

7579
const nextOpenVal = typeof nextOpen === 'boolean' ? nextOpen : !mergedOpen;
80+
setLock(!nextOpenVal);
7681

7782
function triggerUpdate() {
7883
if (
@@ -82,6 +87,7 @@ export default function useOpen(
8287
!cancelFun?.()
8388
) {
8489
triggerEvent(nextOpenVal);
90+
setLock(false);
8591
}
8692
}
8793

@@ -95,5 +101,5 @@ export default function useOpen(
95101
}
96102
});
97103

98-
return [mergedOpen, toggleOpen] as const;
104+
return [mergedOpen, toggleOpen, lock];
99105
}

0 commit comments

Comments
 (0)