diff --git a/examples/panel.tsx b/examples/panel.tsx
index c0c51353..1bfb2417 100644
--- a/examples/panel.tsx
+++ b/examples/panel.tsx
@@ -99,6 +99,7 @@ export default () => {
setValue2(nextValue);
}}
disabled={disabled}
+ defaultActiveKey={['bj', 'haidian']}
/>
diff --git a/src/Cascader.tsx b/src/Cascader.tsx
index c746af10..5a66dee1 100644
--- a/src/Cascader.tsx
+++ b/src/Cascader.tsx
@@ -159,6 +159,7 @@ export interface CascaderProps<
value: GetValueType,
selectOptions: OptionType[],
) => void;
+ defaultActiveKey?: React.Key[];
}
export type SingleValueType = (string | number)[];
@@ -175,6 +176,7 @@ export type InternalCascaderProps = Omit void;
+ defaultActiveKey?: React.Key[];
};
export type CascaderRef = Omit;
diff --git a/src/OptionList/List.tsx b/src/OptionList/List.tsx
index d495af23..e4f21ba5 100644
--- a/src/OptionList/List.tsx
+++ b/src/OptionList/List.tsx
@@ -29,7 +29,7 @@ export type RawOptionListProps = Pick<
| 'direction'
| 'open'
| 'disabled'
->;
+> & { defaultActiveKey?: React.Key[]; };
const RawOptionList = React.forwardRef((props, ref) => {
const {
@@ -41,6 +41,7 @@ const RawOptionList = React.forwardRef((
direction,
open,
disabled,
+ defaultActiveKey,
} = props;
const containerRef = React.useRef(null);
@@ -105,7 +106,7 @@ const RawOptionList = React.forwardRef((
const halfCheckedSet = React.useMemo(() => new Set(toPathKeys(halfValues)), [halfValues]);
// ====================== Accessibility =======================
- const [activeValueCells, setActiveValueCells] = useActive(multiple, open);
+ const [activeValueCells, setActiveValueCells] = useActive(multiple, open, defaultActiveKey);
// =========================== Path ===========================
const onPathOpen = (nextValueCells: React.Key[]) => {
diff --git a/src/OptionList/useActive.ts b/src/OptionList/useActive.ts
index ca0519ec..513464f3 100644
--- a/src/OptionList/useActive.ts
+++ b/src/OptionList/useActive.ts
@@ -7,6 +7,7 @@ import CascaderContext from '../context';
const useActive = (
multiple?: boolean,
open?: boolean,
+ defaultActiveKey?: React.Key[],
): [React.Key[], (activeValueCells: React.Key[]) => void] => {
const { values } = React.useContext(CascaderContext);
@@ -14,7 +15,7 @@ const useActive = (
// Record current dropdown active options
// This also control the open status
- const [activeValueCells, setActiveValueCells] = React.useState([]);
+ const [activeValueCells, setActiveValueCells] = React.useState(defaultActiveKey ?? []);
React.useEffect(
() => {
diff --git a/src/Panel.tsx b/src/Panel.tsx
index 15e36b83..8bdaed40 100644
--- a/src/Panel.tsx
+++ b/src/Panel.tsx
@@ -36,7 +36,8 @@ export type PickType =
| 'style'
| 'direction'
| 'notFoundContent'
- | 'disabled';
+ | 'disabled'
+ | 'defaultActiveKey';
export type PanelProps<
OptionType extends DefaultOptionType = DefaultOptionType,
@@ -70,6 +71,7 @@ export default function Panel<
direction,
notFoundContent = 'Not Found',
disabled,
+ defaultActiveKey,
} = props as Pick;
// ======================== Multiple ========================
@@ -203,6 +205,7 @@ export default function Panel<
open
direction={direction}
disabled={disabled}
+ defaultActiveKey={defaultActiveKey}
/>
)}
diff --git a/tests/Panel.spec.tsx b/tests/Panel.spec.tsx
index c830a9aa..ad917dc0 100644
--- a/tests/Panel.spec.tsx
+++ b/tests/Panel.spec.tsx
@@ -79,6 +79,19 @@ describe('Cascader.Panel', () => {
expect(onChange).toHaveBeenCalledWith([['bamboo', 'little']], expect.anything());
});
+ it('multiple with defaultActiveKey', () => {
+ const onChange = jest.fn();
+ const { container } = render(
+ ,
+ );
+ expect(container.querySelectorAll('.rc-cascader-menu')).toHaveLength(2);
+ });
+
it('rtl', () => {
const { container } = render();
diff --git a/tests/selector.spec.tsx b/tests/selector.spec.tsx
index e7387714..dbd92540 100644
--- a/tests/selector.spec.tsx
+++ b/tests/selector.spec.tsx
@@ -5,10 +5,10 @@ import Cascader from '../src';
import { addressOptions } from './demoOptions';
// Mock `useActive` hook
-jest.mock('../src/OptionList/useActive', () => (multiple: boolean, open: boolean) => {
+jest.mock('../src/OptionList/useActive', () => (multiple: boolean, open: boolean, defaultActiveKey: React.Key[]) => {
// Pass to origin hooks
const originHook = jest.requireActual('../src/OptionList/useActive').default;
- const [activeValueCells, setActiveValueCells] = originHook(multiple, open);
+ const [activeValueCells, setActiveValueCells] = originHook(multiple, open, defaultActiveKey);
(global as any).activeValueCells = activeValueCells;