Skip to content

Commit a6b3b68

Browse files
EmilyyyLiu刘欢zombieJ
authored
refactor: Upgrade utils and replace useMergedState (#940)
* refactor: Upgrade utils and replace useMergedState * feat: defaultvalue * feat: replace useMergedState in useDelayState * chore: adjust logic * chore: clean up --------- Co-authored-by: 刘欢 <[email protected]> Co-authored-by: 二货机器人 <[email protected]>
1 parent 08fd30a commit a6b3b68

File tree

7 files changed

+30
-32
lines changed

7 files changed

+30
-32
lines changed

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@
4141
"dependencies": {
4242
"@rc-component/resize-observer": "^1.0.0",
4343
"@rc-component/trigger": "^3.0.0",
44-
"@rc-component/util": "^1.2.1",
44+
"@rc-component/util": "^1.3.0",
4545
"classnames": "^2.2.1",
4646
"rc-overflow": "^1.3.2"
4747
},

src/PickerInput/RangePicker.tsx

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { useEvent, useMergedState } from '@rc-component/util';
1+
import { useEvent, useControlledState } from '@rc-component/util';
22
import cls from 'classnames';
33
import useLayoutEffect from '@rc-component/util/lib/hooks/useLayoutEffect';
44
import omit from '@rc-component/util/lib/omit';
@@ -311,9 +311,7 @@ function RangePicker<DateType extends object = any>(
311311
}, [showTime, activeIndex, calendarValue, activeIndexList]);
312312

313313
// ========================= Mode =========================
314-
const [modes, setModes] = useMergedState<[PanelMode, PanelMode]>([picker, picker], {
315-
value: mode,
316-
});
314+
const [modes, setModes] = useControlledState<[PanelMode, PanelMode]>([picker, picker], mode);
317315

318316
const mergedMode = modes[activeIndex] || picker;
319317

src/PickerInput/SinglePicker.tsx

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { useEvent, useMergedState } from '@rc-component/util';
1+
import { useEvent, useControlledState } from '@rc-component/util';
22
import cls from 'classnames';
33
import useLayoutEffect from '@rc-component/util/lib/hooks/useLayoutEffect';
44
import omit from '@rc-component/util/lib/omit';
@@ -261,9 +261,7 @@ function Picker<DateType extends object = any>(
261261
};
262262

263263
// ========================= Mode =========================
264-
const [mergedMode, setMode] = useMergedState(picker, {
265-
value: mode,
266-
});
264+
const [mergedMode, setMode] = useControlledState(picker, mode);
267265

268266
/** Extends from `mergedMode` to patch `datetime` mode */
269267
const internalMode: InternalMode = mergedMode === 'date' && showTime ? 'datetime' : mergedMode;

src/PickerInput/hooks/useDelayState.ts

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { useEvent, useMergedState } from '@rc-component/util';
1+
import { useEvent, useControlledState } from '@rc-component/util';
22
import raf from '@rc-component/util/lib/raf';
33
import React from 'react';
44

@@ -11,7 +11,15 @@ export default function useDelayState<T>(
1111
defaultValue?: T,
1212
onChange?: (next: T) => void,
1313
): [state: T, setState: (nextState: T, immediately?: boolean) => void] {
14-
const [state, setState] = useMergedState<T>(defaultValue, { value });
14+
const [state, setState] = useControlledState<T>(defaultValue, value);
15+
16+
// Need force update to ensure React re-render
17+
const [, forceUpdate] = React.useState({});
18+
19+
const triggerUpdate = useEvent((nextState: T) => {
20+
setState(nextState);
21+
forceUpdate({});
22+
});
1523

1624
const nextValueRef = React.useRef<T>(value);
1725

@@ -22,7 +30,7 @@ export default function useDelayState<T>(
2230
};
2331

2432
const doUpdate = useEvent(() => {
25-
setState(nextValueRef.current);
33+
triggerUpdate(nextValueRef.current);
2634

2735
if (onChange && state !== nextValueRef.current) {
2836
onChange(nextValueRef.current);

src/PickerInput/hooks/useRangePickerValue.ts

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { useMergedState } from '@rc-component/util';
1+
import { useControlledState } from '@rc-component/util';
22
import useLayoutEffect from '@rc-component/util/lib/hooks/useLayoutEffect';
33
import * as React from 'react';
44
import type { GenerateConfig } from '../../generate';
@@ -72,14 +72,15 @@ export default function useRangePickerValue<DateType extends object, ValueType e
7272
const [startPickerValue, endPickerValue] = pickerValue;
7373

7474
// PickerValue state
75-
const [mergedStartPickerValue, setStartPickerValue] = useMergedState(
75+
const [mergedStartPickerValue, setStartPickerValue] = useControlledState(
7676
() => getDefaultPickerValue(0),
77-
{ value: startPickerValue },
77+
startPickerValue,
7878
);
7979

80-
const [mergedEndPickerValue, setEndPickerValue] = useMergedState(() => getDefaultPickerValue(1), {
81-
value: endPickerValue,
82-
});
80+
const [mergedEndPickerValue, setEndPickerValue] = useControlledState(
81+
() => getDefaultPickerValue(1),
82+
endPickerValue,
83+
);
8384

8485
// Current PickerValue
8586
const currentPickerValue = React.useMemo(() => {

src/PickerInput/hooks/useRangeValue.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { useEvent, useMergedState } from '@rc-component/util';
1+
import { useEvent, useControlledState } from '@rc-component/util';
22
import * as React from 'react';
33
import type { GenerateConfig } from '../../generate';
44
import useSyncState from '../../hooks/useSyncState';
@@ -117,7 +117,7 @@ export function useInnerValue<ValueType extends DateType[], DateType extends obj
117117
onOk?: (dates: ValueType) => void,
118118
) {
119119
// This is the root value which will sync with controlled or uncontrolled value
120-
const [innerValue, setInnerValue] = useMergedState(defaultValue, { value });
120+
const [innerValue, setInnerValue] = useControlledState(defaultValue, value);
121121
const mergedValue = innerValue || (EMPTY_VALUE as ValueType);
122122

123123
// ========================= Inner Values =========================

src/PickerPanel/index.tsx

Lines changed: 5 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import classNames from 'classnames';
2-
import { useEvent, useMergedState, warning } from '@rc-component/util';
2+
import { useEvent, useControlledState, warning } from '@rc-component/util';
33
import * as React from 'react';
44
import useLocale from '../hooks/useLocale';
55
import { fillShowTimeConfig, getTimeProps } from '../hooks/useTimeConfig';
@@ -227,10 +227,7 @@ function PickerPanel<DateType extends object = any>(
227227
const now = generateConfig.getNow();
228228

229229
// ========================== Mode ==========================
230-
const [mergedMode, setMergedMode] = useMergedState<PanelMode>(picker, {
231-
value: mode,
232-
postState: (val) => val || 'date',
233-
});
230+
const [mergedMode, setMergedMode] = useControlledState<PanelMode>(picker || 'date', mode);
234231

235232
const internalMode: InternalMode =
236233
mergedMode === 'date' && mergedShowTime ? 'datetime' : mergedMode;
@@ -241,9 +238,7 @@ function PickerPanel<DateType extends object = any>(
241238
// ========================= Value ==========================
242239
// >>> Real value
243240
// Interactive with `onChange` event which only trigger when the `mode` is `picker`
244-
const [innerValue, setMergedValue] = useMergedState(defaultValue, {
245-
value,
246-
});
241+
const [innerValue, setMergedValue] = useControlledState(defaultValue, value);
247242

248243
const mergedValue = React.useMemo(() => {
249244
// Clean up `[null]`
@@ -282,11 +277,9 @@ function PickerPanel<DateType extends object = any>(
282277

283278
// >>> PickerValue
284279
// PickerValue is used to control the current displaying panel
285-
const [mergedPickerValue, setInternalPickerValue] = useMergedState(
280+
const [mergedPickerValue, setInternalPickerValue] = useControlledState(
286281
defaultPickerValue || mergedValue[0] || now,
287-
{
288-
value: pickerValue,
289-
},
282+
pickerValue,
290283
);
291284

292285
React.useEffect(() => {

0 commit comments

Comments
 (0)