From c45febccd4f1e9f10417bfbc0ce780eeecf13e27 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BA=8C=E8=B4=A7=E6=9C=BA=E5=99=A8=E4=BA=BA?= Date: Wed, 17 Dec 2025 16:52:44 +0800 Subject: [PATCH] fix: defaultOpen not working --- src/BaseSelect/index.tsx | 7 +++++-- src/hooks/useOpen.ts | 3 ++- tests/Select.test.tsx | 10 ++++++++++ 3 files changed, 17 insertions(+), 3 deletions(-) diff --git a/src/BaseSelect/index.tsx b/src/BaseSelect/index.tsx index b80e4fe0..cb2ac94a 100644 --- a/src/BaseSelect/index.tsx +++ b/src/BaseSelect/index.tsx @@ -358,8 +358,11 @@ const BaseSelect = React.forwardRef((props, ref) // Not trigger `open` when `notFoundContent` is empty const emptyListContent = !notFoundContent && emptyOptions; - const [mergedOpen, triggerOpen] = useOpen(open, onPopupVisibleChange, (nextOpen) => - disabled || emptyListContent ? false : nextOpen, + const [mergedOpen, triggerOpen] = useOpen( + defaultOpen || false, + open, + onPopupVisibleChange, + (nextOpen) => (disabled || emptyListContent ? false : nextOpen), ); // ============================= Search ============================= diff --git a/src/hooks/useOpen.ts b/src/hooks/useOpen.ts index 53c6d92c..8d248054 100644 --- a/src/hooks/useOpen.ts +++ b/src/hooks/useOpen.ts @@ -39,6 +39,7 @@ export type TriggerOpenType = ( * On client-side hydration, it syncs with the actual open state. */ export default function useOpen( + defaultOpen: boolean, propOpen: boolean, onOpen: (nextOpen: boolean) => void, postOpen: (nextOpen: boolean) => boolean, @@ -50,7 +51,7 @@ export default function useOpen( setRendered(true); }, []); - const [stateOpen, internalSetOpen] = useControlledState(false, propOpen); + const [stateOpen, internalSetOpen] = useControlledState(defaultOpen, propOpen); // During SSR, always return false for open state const ssrSafeOpen = rendered ? stateOpen : false; diff --git a/tests/Select.test.tsx b/tests/Select.test.tsx index 27531303..ce920b2b 100644 --- a/tests/Select.test.tsx +++ b/tests/Select.test.tsx @@ -66,6 +66,16 @@ describe('Select.Basic', () => { expect(onPopupVisibleChange).toHaveBeenCalledWith(false); }); + it('should defaultOpen work', () => { + const { container } = render( + , + ); + expectOpen(container); + }); + describe('render', () => { function genSelect(props?: Partial) { return (