@@ -148,6 +148,10 @@ export interface SelectProps<OptionsType extends object[], ValueType> extends Re
148
148
internalProps ?: {
149
149
mark ?: string ;
150
150
onClear ?: OnClear ;
151
+ skipTriggerChange ?: boolean ;
152
+ skipTriggerSelect ?: boolean ;
153
+ onRawSelect ?: ( value : RawValueType , option : OptionsType [ number ] ) => void ;
154
+ onRawDeselect ?: ( value : RawValueType , option : OptionsType [ number ] ) => void ;
151
155
} ;
152
156
}
153
157
@@ -289,6 +293,8 @@ export default function generateSelector<
289
293
...restProps
290
294
} = props ;
291
295
296
+ const useInternalProps = internalProps . mark === INTERNAL_PROPS_MARK ;
297
+
292
298
const domProps = omitDOMProps ? omitDOMProps ( restProps ) : restProps ;
293
299
DEFAULT_OMIT_PROPS . forEach ( prop => {
294
300
delete domProps [ prop ] ;
@@ -428,25 +434,41 @@ export default function generateSelector<
428
434
) ;
429
435
430
436
const triggerSelect = ( newValue : RawValueType , isSelect : boolean ) => {
431
- const selectValue = ( mergedLabelInValue
432
- ? getLabeledValue ( newValue , {
433
- options : mergedFlattenOptions ,
434
- prevValue : baseValue ,
435
- labelInValue : mergedLabelInValue ,
436
- optionLabelProp : mergedOptionLabelProp ,
437
- } )
438
- : newValue ) as SingleType < ValueType > ;
439
-
440
437
const outOption = findValueOption ( [ newValue ] , mergedFlattenOptions ) [ 0 ] ;
441
438
442
- if ( isSelect && onSelect ) {
443
- onSelect ( selectValue , outOption ) ;
444
- } else if ( ! isSelect && onDeselect ) {
445
- onDeselect ( selectValue , outOption ) ;
439
+ if ( ! internalProps . skipTriggerSelect ) {
440
+ // Skip trigger `onSelect` or `onDeselect` if configured
441
+ const selectValue = ( mergedLabelInValue
442
+ ? getLabeledValue ( newValue , {
443
+ options : mergedFlattenOptions ,
444
+ prevValue : baseValue ,
445
+ labelInValue : mergedLabelInValue ,
446
+ optionLabelProp : mergedOptionLabelProp ,
447
+ } )
448
+ : newValue ) as SingleType < ValueType > ;
449
+
450
+ if ( isSelect && onSelect ) {
451
+ onSelect ( selectValue , outOption ) ;
452
+ } else if ( ! isSelect && onDeselect ) {
453
+ onDeselect ( selectValue , outOption ) ;
454
+ }
455
+ }
456
+
457
+ // Trigger internal event
458
+ if ( useInternalProps ) {
459
+ if ( isSelect && internalProps . onRawSelect ) {
460
+ internalProps . onRawSelect ( newValue , outOption ) ;
461
+ } else if ( ! isSelect && internalProps . onRawDeselect ) {
462
+ internalProps . onRawDeselect ( newValue , outOption ) ;
463
+ }
446
464
}
447
465
} ;
448
466
449
467
const triggerChange = ( newRawValues : RawValueType [ ] ) => {
468
+ if ( useInternalProps && internalProps . skipTriggerChange ) {
469
+ return ;
470
+ }
471
+
450
472
const outValues = toOuterValues < FlattenOptionsType < OptionsType > > ( Array . from ( newRawValues ) , {
451
473
labelInValue : mergedLabelInValue ,
452
474
options : mergedFlattenOptions ,
@@ -766,7 +788,7 @@ export default function generateSelector<
766
788
let clearNode : React . ReactNode ;
767
789
const onClearMouseDown : React . MouseEventHandler < HTMLSpanElement > = ( ) => {
768
790
// Trigger internal `onClear` event
769
- if ( internalProps . mark === INTERNAL_PROPS_MARK && internalProps . onClear ) {
791
+ if ( useInternalProps && internalProps . onClear ) {
770
792
internalProps . onClear ( ) ;
771
793
}
772
794
0 commit comments