Skip to content

Commit 9ead167

Browse files
authored
chore: useMergeState (#508)
1 parent 7da0211 commit 9ead167

File tree

1 file changed

+14
-22
lines changed

1 file changed

+14
-22
lines changed

src/generate.tsx

Lines changed: 14 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -354,26 +354,18 @@ export default function generateSelector<
354354
}));
355355

356356
// ============================= Value ==============================
357-
const [innerValue, setInnerValue] = React.useState<ValueType>(value || defaultValue);
358-
const baseValue = value !== undefined ? value : innerValue;
359-
360-
// Should reset when controlled to be uncontrolled
361-
const prevValueRef = React.useRef(value);
362-
React.useEffect(() => {
363-
if (prevValueRef.current !== value && (value === undefined || value === null)) {
364-
setInnerValue(undefined);
365-
}
366-
prevValueRef.current = value;
367-
}, [value]);
357+
const [mergedValue, setMergedValue] = useMergedState(defaultValue, {
358+
value,
359+
});
368360

369361
/** Unique raw values */
370362
const mergedRawValue = React.useMemo<RawValueType[]>(
371363
() =>
372-
toInnerValue(baseValue, {
364+
toInnerValue(mergedValue, {
373365
labelInValue: mergedLabelInValue,
374366
combobox: mode === 'combobox',
375367
}),
376-
[baseValue, mergedLabelInValue],
368+
[mergedValue, mergedLabelInValue],
377369
);
378370
/** We cache a set of raw values to speed up check */
379371
const rawValues = React.useMemo<Set<RawValueType>>(() => new Set(mergedRawValue), [
@@ -385,8 +377,8 @@ export default function generateSelector<
385377
const [activeValue, setActiveValue] = React.useState<string>(null);
386378
const [innerSearchValue, setInnerSearchValue] = React.useState('');
387379
let mergedSearchValue = innerSearchValue;
388-
if (mode === 'combobox' && value !== undefined) {
389-
mergedSearchValue = value as string;
380+
if (mode === 'combobox' && mergedValue !== undefined) {
381+
mergedSearchValue = mergedValue as string;
390382
} else if (searchValue !== undefined) {
391383
mergedSearchValue = searchValue;
392384
} else if (inputValue) {
@@ -406,14 +398,14 @@ export default function generateSelector<
406398
if (mode === 'tags' && fillOptionsWithMissingValue) {
407399
newOptions = fillOptionsWithMissingValue(
408400
newOptions,
409-
baseValue,
401+
mergedValue,
410402
mergedOptionLabelProp,
411403
labelInValue,
412404
);
413405
}
414406

415407
return newOptions || ([] as OptionsType);
416-
}, [options, children, mode, baseValue]);
408+
}, [options, children, mode, mergedValue]);
417409

418410
const mergedFlattenOptions: FlattenOptionsType<OptionsType> = React.useMemo(
419411
() => flattenOptions(mergedOptions, props),
@@ -459,7 +451,7 @@ export default function generateSelector<
459451
const valueOptions = getValueOption([val]);
460452
const displayValue = getLabeledValue(val, {
461453
options: valueOptions,
462-
prevValue: baseValue,
454+
prevValue: mergedValue,
463455
labelInValue: mergedLabelInValue,
464456
optionLabelProp: mergedOptionLabelProp,
465457
});
@@ -480,7 +472,7 @@ export default function generateSelector<
480472
}
481473

482474
return tmpValues;
483-
}, [baseValue, mergedOptions, mode]);
475+
}, [mergedValue, mergedOptions, mode]);
484476

485477
// Polyfill with cache label
486478
displayValues = useCacheDisplayValue(displayValues);
@@ -494,7 +486,7 @@ export default function generateSelector<
494486
const selectValue = (mergedLabelInValue
495487
? getLabeledValue(newValue, {
496488
options: newValueOption,
497-
prevValue: baseValue,
489+
prevValue: mergedValue,
498490
labelInValue: mergedLabelInValue,
499491
optionLabelProp: mergedOptionLabelProp,
500492
})
@@ -526,7 +518,7 @@ export default function generateSelector<
526518
labelInValue: mergedLabelInValue,
527519
options: newRawValuesOptions,
528520
getLabeledValue,
529-
prevValue: baseValue,
521+
prevValue: mergedValue,
530522
optionLabelProp: mergedOptionLabelProp,
531523
});
532524

@@ -538,7 +530,7 @@ export default function generateSelector<
538530
onChange(outValue, isMultiple ? outOptions : outOptions[0]);
539531
}
540532

541-
setInnerValue(outValue);
533+
setMergedValue(outValue);
542534
};
543535

544536
const onInternalSelect = (

0 commit comments

Comments
 (0)