diff --git a/examples/switchType.tsx b/examples/switchType.tsx new file mode 100644 index 000000000..2678adab3 --- /dev/null +++ b/examples/switchType.tsx @@ -0,0 +1,36 @@ +import React, { useState } from 'react'; +import { Moment } from 'moment'; +import Picker from '../src/Picker'; +import momentGenerateConfig from '../src/generate/moment'; +import zhCN from '../src/locale/zh_CN'; +import '../assets/index.less'; + +const sharedProps = { + generateConfig: momentGenerateConfig, +}; + +function PickerWithType({ type, onChange }) { + if (type === 'date') return {...sharedProps} onChange={onChange} locale={zhCN} />; + return {...sharedProps} picker={type} onChange={onChange} locale={zhCN} />; +} + +export default function SwitchablePicker() { + const [type, setType] = useState('date'); + return ( + <> + + console.log(value)} /> + + ); +} diff --git a/src/PickerPanel.tsx b/src/PickerPanel.tsx index 60ee18dc6..2c09f3a49 100644 --- a/src/PickerPanel.tsx +++ b/src/PickerPanel.tsx @@ -238,6 +238,10 @@ function PickerPanel(props: PickerPanelProps) { }, ); + React.useEffect(() => { + setInnerMode(picker); + }, [picker]); + const [sourceMode, setSourceMode] = React.useState(() => mergedMode); const onInternalPanelChange = (newMode: PanelMode | null, viewValue: DateType) => { diff --git a/tests/picker.spec.tsx b/tests/picker.spec.tsx index 5eb625a80..1430fae3b 100644 --- a/tests/picker.spec.tsx +++ b/tests/picker.spec.tsx @@ -730,6 +730,15 @@ describe('Picker.Basic', () => { expect(wrapper.render()).toMatchSnapshot(); }); + it('change panel when `picker` changed', () => { + const wrapper = mount(); + expect(wrapper.find('.rc-picker-week-panel').length).toEqual(1); + wrapper.setProps({ picker: 'month' }); + wrapper.update(); + expect(wrapper.find('.rc-picker-week-panel').length).toEqual(0); + expect(wrapper.find('.rc-picker-month-panel').length).toEqual(1); + }); + describe('hover value', () => { it('should restore when leave', () => { const wrapper = mount();