@@ -354,26 +354,18 @@ export default function generateSelector<
354
354
} ) ) ;
355
355
356
356
// ============================= 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
+ } ) ;
368
360
369
361
/** Unique raw values */
370
362
const mergedRawValue = React . useMemo < RawValueType [ ] > (
371
363
( ) =>
372
- toInnerValue ( baseValue , {
364
+ toInnerValue ( mergedValue , {
373
365
labelInValue : mergedLabelInValue ,
374
366
combobox : mode === 'combobox' ,
375
367
} ) ,
376
- [ baseValue , mergedLabelInValue ] ,
368
+ [ mergedValue , mergedLabelInValue ] ,
377
369
) ;
378
370
/** We cache a set of raw values to speed up check */
379
371
const rawValues = React . useMemo < Set < RawValueType > > ( ( ) => new Set ( mergedRawValue ) , [
@@ -385,8 +377,8 @@ export default function generateSelector<
385
377
const [ activeValue , setActiveValue ] = React . useState < string > ( null ) ;
386
378
const [ innerSearchValue , setInnerSearchValue ] = React . useState ( '' ) ;
387
379
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 ;
390
382
} else if ( searchValue !== undefined ) {
391
383
mergedSearchValue = searchValue ;
392
384
} else if ( inputValue ) {
@@ -406,14 +398,14 @@ export default function generateSelector<
406
398
if ( mode === 'tags' && fillOptionsWithMissingValue ) {
407
399
newOptions = fillOptionsWithMissingValue (
408
400
newOptions ,
409
- baseValue ,
401
+ mergedValue ,
410
402
mergedOptionLabelProp ,
411
403
labelInValue ,
412
404
) ;
413
405
}
414
406
415
407
return newOptions || ( [ ] as OptionsType ) ;
416
- } , [ options , children , mode , baseValue ] ) ;
408
+ } , [ options , children , mode , mergedValue ] ) ;
417
409
418
410
const mergedFlattenOptions : FlattenOptionsType < OptionsType > = React . useMemo (
419
411
( ) => flattenOptions ( mergedOptions , props ) ,
@@ -459,7 +451,7 @@ export default function generateSelector<
459
451
const valueOptions = getValueOption ( [ val ] ) ;
460
452
const displayValue = getLabeledValue ( val , {
461
453
options : valueOptions ,
462
- prevValue : baseValue ,
454
+ prevValue : mergedValue ,
463
455
labelInValue : mergedLabelInValue ,
464
456
optionLabelProp : mergedOptionLabelProp ,
465
457
} ) ;
@@ -480,7 +472,7 @@ export default function generateSelector<
480
472
}
481
473
482
474
return tmpValues ;
483
- } , [ baseValue , mergedOptions , mode ] ) ;
475
+ } , [ mergedValue , mergedOptions , mode ] ) ;
484
476
485
477
// Polyfill with cache label
486
478
displayValues = useCacheDisplayValue ( displayValues ) ;
@@ -494,7 +486,7 @@ export default function generateSelector<
494
486
const selectValue = ( mergedLabelInValue
495
487
? getLabeledValue ( newValue , {
496
488
options : newValueOption ,
497
- prevValue : baseValue ,
489
+ prevValue : mergedValue ,
498
490
labelInValue : mergedLabelInValue ,
499
491
optionLabelProp : mergedOptionLabelProp ,
500
492
} )
@@ -526,7 +518,7 @@ export default function generateSelector<
526
518
labelInValue : mergedLabelInValue ,
527
519
options : newRawValuesOptions ,
528
520
getLabeledValue,
529
- prevValue : baseValue ,
521
+ prevValue : mergedValue ,
530
522
optionLabelProp : mergedOptionLabelProp ,
531
523
} ) ;
532
524
@@ -538,7 +530,7 @@ export default function generateSelector<
538
530
onChange ( outValue , isMultiple ? outOptions : outOptions [ 0 ] ) ;
539
531
}
540
532
541
- setInnerValue ( outValue ) ;
533
+ setMergedValue ( outValue ) ;
542
534
} ;
543
535
544
536
const onInternalSelect = (
0 commit comments