From b9992f4a08574efb47b6e6cd80eb1e888b9a1ede Mon Sep 17 00:00:00 2001 From: Wei Zhu Date: Wed, 25 Jul 2018 15:42:48 +0800 Subject: [PATCH] fix: DatePicker can not change year/month when under control React 16.4 call getDerivedStateFromProps on every render close #11447 close #11440 close #11439 close #11416 close #11405 --- components/date-picker/RangePicker.tsx | 8 +++++++- components/date-picker/createPicker.tsx | 14 ++++++++++---- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/components/date-picker/RangePicker.tsx b/components/date-picker/RangePicker.tsx index 50e78ea797..cf66d680aa 100644 --- a/components/date-picker/RangePicker.tsx +++ b/components/date-picker/RangePicker.tsx @@ -5,6 +5,7 @@ import { polyfill } from 'react-lifecycles-compat'; import RangeCalendar from 'rc-calendar/lib/RangeCalendar'; import RcDatePicker from 'rc-calendar/lib/Picker'; import classNames from 'classnames'; +import shallowequal from 'shallowequal'; import Icon from '../icon'; import Tag from '../tag'; import warning from '../_util/warning'; @@ -77,8 +78,13 @@ class RangePicker extends React.Component { const value = nextProps.value || []; state = { value, - showDate: getShowDateFromValue(value) || prevState.showDate, }; + if (!shallowequal(nextProps.value, prevState.value)) { + state = { + ...state, + showDate: getShowDateFromValue(value) || prevState.showDate, + }; + } } if (('open' in nextProps) && prevState.open !== nextProps.open) { state = { diff --git a/components/date-picker/createPicker.tsx b/components/date-picker/createPicker.tsx index c2ed5dcda8..959af2dceb 100644 --- a/components/date-picker/createPicker.tsx +++ b/components/date-picker/createPicker.tsx @@ -23,14 +23,20 @@ export default function createPicker(TheCalendar: React.ComponentClass): any { showToday: true, }; - static getDerivedStateFromProps(nextProps: PickerProps) { + static getDerivedStateFromProps(nextProps: PickerProps, prevState: any) { + let state = null; if ('value' in nextProps) { - return { + state = { value: nextProps.value, - showDate: nextProps.value, }; + if (nextProps.value !== prevState.value) { + state = { + ...state, + showDate: nextProps.value, + }; + } } - return null; + return state; } private input: any;