@@ -30,6 +30,7 @@ import {
30
30
INTERNAL_PROPS_MARK ,
31
31
SelectSource ,
32
32
CustomTagProps ,
33
+ FlattenOptionMapType ,
33
34
} from './interface/generator' ;
34
35
import { OptionListProps , RefOptionListProps } from './OptionList' ;
35
36
import { toInnerValue , toOuterValues , removeLastEnabledValue , getUUID } from './utils/commonUtil' ;
@@ -40,6 +41,7 @@ import useLayoutEffect from './hooks/useLayoutEffect';
40
41
import { getSeparatedContent } from './utils/valueUtil' ;
41
42
import useSelectTriggerControl from './hooks/useSelectTriggerControl' ;
42
43
import useCacheDisplayValue from './hooks/useCacheDisplayValue' ;
44
+ import useCacheOptions from './hooks/useCacheOptions' ;
43
45
44
46
const DEFAULT_OMIT_PROPS = [
45
47
'removeIcon' ,
@@ -182,14 +184,17 @@ export interface GenerateConfig<OptionsType extends object[]> {
182
184
/** Flatten nest options into raw option list */
183
185
flattenOptions : ( options : OptionsType , props : any ) => FlattenOptionsType < OptionsType > ;
184
186
/** Convert single raw value into { label, value } format. Will be called by each value */
185
- getLabeledValue : GetLabeledValue < FlattenOptionsType < OptionsType > > ;
187
+ getLabeledValue : GetLabeledValue < FlattenOptionMapType < OptionsType [ number ] > > ;
186
188
filterOptions : FilterOptions < OptionsType > ;
187
189
findValueOption : (
188
190
values : RawValueType [ ] ,
189
- options : FlattenOptionsType < OptionsType > ,
191
+ optionMap : FlattenOptionMapType < OptionsType [ number ] > ,
190
192
) => OptionsType ;
191
193
/** Check if a value is disabled */
192
- isValueDisabled : ( value : RawValueType , options : FlattenOptionsType < OptionsType > ) => boolean ;
194
+ isValueDisabled : (
195
+ value : RawValueType ,
196
+ optionMap : FlattenOptionMapType < OptionsType [ number ] > ,
197
+ ) => boolean ;
193
198
warningProps ?: ( props : any ) => void ;
194
199
fillOptionsWithMissingValue ?: (
195
200
options : OptionsType ,
@@ -419,6 +424,8 @@ export default function generateSelector<
419
424
[ mergedOptions ] ,
420
425
) ;
421
426
427
+ const optionMap = useCacheOptions ( mergedRawValue , mergedFlattenOptions ) ;
428
+
422
429
// Display options for OptionList
423
430
const displayOptions = React . useMemo < OptionsType > ( ( ) => {
424
431
if ( ! mergedSearchValue || ! mergedShowSearch ) {
@@ -455,15 +462,15 @@ export default function generateSelector<
455
462
( ) =>
456
463
mergedRawValue . map ( ( val : RawValueType ) => {
457
464
const displayValue = getLabeledValue ( val , {
458
- options : mergedFlattenOptions ,
465
+ optionMap ,
459
466
prevValue : baseValue ,
460
467
labelInValue : mergedLabelInValue ,
461
468
optionLabelProp : mergedOptionLabelProp ,
462
469
} ) ;
463
470
464
471
return {
465
472
...displayValue ,
466
- disabled : isValueDisabled ( val , mergedFlattenOptions ) ,
473
+ disabled : isValueDisabled ( val , optionMap ) ,
467
474
} ;
468
475
} ) ,
469
476
[ baseValue , mergedOptions ] ,
@@ -473,13 +480,13 @@ export default function generateSelector<
473
480
displayValues = useCacheDisplayValue ( displayValues ) ;
474
481
475
482
const triggerSelect = ( newValue : RawValueType , isSelect : boolean , source : SelectSource ) => {
476
- const outOption = findValueOption ( [ newValue ] , mergedFlattenOptions ) [ 0 ] ;
483
+ const outOption = findValueOption ( [ newValue ] , optionMap ) [ 0 ] ;
477
484
478
485
if ( ! internalProps . skipTriggerSelect ) {
479
486
// Skip trigger `onSelect` or `onDeselect` if configured
480
487
const selectValue = ( mergedLabelInValue
481
488
? getLabeledValue ( newValue , {
482
- options : mergedFlattenOptions ,
489
+ optionMap ,
483
490
prevValue : baseValue ,
484
491
labelInValue : mergedLabelInValue ,
485
492
optionLabelProp : mergedOptionLabelProp ,
@@ -508,18 +515,21 @@ export default function generateSelector<
508
515
return ;
509
516
}
510
517
511
- const outValues = toOuterValues < FlattenOptionsType < OptionsType > > ( Array . from ( newRawValues ) , {
512
- labelInValue : mergedLabelInValue ,
513
- options : mergedFlattenOptions ,
514
- getLabeledValue,
515
- prevValue : baseValue ,
516
- optionLabelProp : mergedOptionLabelProp ,
517
- } ) ;
518
+ const outValues = toOuterValues < FlattenOptionMapType < OptionsType [ number ] > > (
519
+ Array . from ( newRawValues ) ,
520
+ {
521
+ labelInValue : mergedLabelInValue ,
522
+ optionMap,
523
+ getLabeledValue,
524
+ prevValue : baseValue ,
525
+ optionLabelProp : mergedOptionLabelProp ,
526
+ } ,
527
+ ) ;
518
528
519
529
const outValue : ValueType = ( isMultiple ? outValues : outValues [ 0 ] ) as ValueType ;
520
530
// Skip trigger if prev & current value is both empty
521
531
if ( onChange && ( mergedRawValue . length !== 0 || outValues . length !== 0 ) ) {
522
- const outOptions = findValueOption ( newRawValues , mergedFlattenOptions ) ;
532
+ const outOptions = findValueOption ( newRawValues , optionMap ) ;
523
533
524
534
onChange ( outValue , isMultiple ? outOptions : outOptions [ 0 ] ) ;
525
535
}
0 commit comments