Skip to content

Commit aeb8d39

Browse files
authored
fix: Update display value when picker changed (#32)
1 parent 8bf0deb commit aeb8d39

File tree

4 files changed

+43
-10
lines changed

4 files changed

+43
-10
lines changed

package.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,8 @@
4141
"classnames": "^2.2.1",
4242
"moment": "^2.24.0",
4343
"rc-trigger": "^4.0.0",
44-
"rc-util": "^4.17.0"
44+
"rc-util": "^4.17.0",
45+
"shallowequal": "^1.1.0"
4546
},
4647
"engines": {
4748
"node": ">=8.x"
@@ -52,6 +53,7 @@
5253
"@types/jest": "^24.0.23",
5354
"@types/react": "^16.9.2",
5455
"@types/react-dom": "^16.9.0",
56+
"@types/shallowequal": "^1.1.1",
5557
"@umijs/fabric": "^1.1.10",
5658
"coveralls": "^3.0.6",
5759
"cross-env": "^6.0.0",

src/Picker.tsx

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -332,6 +332,13 @@ function InnerPicker<DateType>(props: PickerProps<DateType>) {
332332
}
333333
}, [mergedOpen, valueTexts]);
334334

335+
// Change picker should sync back with text value
336+
React.useEffect(() => {
337+
if (!mergedOpen) {
338+
resetText();
339+
}
340+
}, [picker]);
341+
335342
// Sync innerValue with control mode
336343
React.useEffect(() => {
337344
// Sync select value

src/hooks/useValueTexts.ts

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
import * as React from 'react';
1+
import shallowEqual from 'shallowequal';
2+
import useMemo from 'rc-util/lib/hooks/useMemo';
23
import { GenerateConfig } from '../generate';
34
import { Locale } from '../interface';
45

@@ -12,12 +13,16 @@ export default function useValueTexts<DateType>(
1213
value: DateType | null,
1314
{ formatList, generateConfig, locale }: ValueTextConfig<DateType>,
1415
) {
15-
return React.useMemo<string[]>(() => {
16-
if (!value) {
17-
return [''];
18-
}
19-
return formatList.map(subFormat =>
20-
generateConfig.locale.format(locale.locale, value, subFormat),
21-
);
22-
}, [value]);
16+
return useMemo<string[]>(
17+
() => {
18+
if (!value) {
19+
return [''];
20+
}
21+
return formatList.map(subFormat =>
22+
generateConfig.locale.format(locale.locale, value, subFormat),
23+
);
24+
},
25+
[value, formatList],
26+
(prev, next) => prev[0] !== next[0] || !shallowEqual(prev[1], next[1]),
27+
);
2328
}

tests/picker.spec.tsx

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -604,4 +604,23 @@ describe('Picker.Basic', () => {
604604
wrapper.closePicker();
605605
expect(wrapper.find('input').props().value).toEqual('2000-01-01');
606606
});
607+
608+
it('switch picker should change format', () => {
609+
const wrapper = mount(
610+
<MomentPicker
611+
picker="date"
612+
showTime
613+
defaultValue={getMoment('1999-09-03')}
614+
/>,
615+
);
616+
expect(wrapper.find('input').props().value).toEqual('1999-09-03 00:00:00');
617+
618+
[['date', '1999-09-03'], ['month', '1999-09'], ['year', '1999']].forEach(
619+
([picker, text]) => {
620+
wrapper.setProps({ picker, showTime: false });
621+
wrapper.update();
622+
expect(wrapper.find('input').props().value).toEqual(text);
623+
},
624+
);
625+
});
607626
});

0 commit comments

Comments
 (0)