Skip to content

Commit 4a441b5

Browse files
authored
Revert "chore: optimize multiple onChange performence(#22822) (#499)" (#500)
This reverts commit 7f0dbd5.
1 parent 777e571 commit 4a441b5

File tree

5 files changed

+66
-87
lines changed

5 files changed

+66
-87
lines changed

src/generate.tsx

Lines changed: 15 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@ import {
3030
INTERNAL_PROPS_MARK,
3131
SelectSource,
3232
CustomTagProps,
33-
FlattenOptionMapType,
3433
} from './interface/generator';
3534
import { OptionListProps, RefOptionListProps } from './OptionList';
3635
import { toInnerValue, toOuterValues, removeLastEnabledValue, getUUID } from './utils/commonUtil';
@@ -41,7 +40,6 @@ import useLayoutEffect from './hooks/useLayoutEffect';
4140
import { getSeparatedContent } from './utils/valueUtil';
4241
import useSelectTriggerControl from './hooks/useSelectTriggerControl';
4342
import useCacheDisplayValue from './hooks/useCacheDisplayValue';
44-
import useCacheOptions from './hooks/useCacheOptions';
4543

4644
const DEFAULT_OMIT_PROPS = [
4745
'removeIcon',
@@ -184,17 +182,14 @@ export interface GenerateConfig<OptionsType extends object[]> {
184182
/** Flatten nest options into raw option list */
185183
flattenOptions: (options: OptionsType, props: any) => FlattenOptionsType<OptionsType>;
186184
/** Convert single raw value into { label, value } format. Will be called by each value */
187-
getLabeledValue: GetLabeledValue<FlattenOptionMapType<OptionsType[number]>>;
185+
getLabeledValue: GetLabeledValue<FlattenOptionsType<OptionsType>>;
188186
filterOptions: FilterOptions<OptionsType>;
189187
findValueOption: (
190188
values: RawValueType[],
191-
optionMap: FlattenOptionMapType<OptionsType[number]>,
189+
options: FlattenOptionsType<OptionsType>,
192190
) => OptionsType;
193191
/** Check if a value is disabled */
194-
isValueDisabled: (
195-
value: RawValueType,
196-
optionMap: FlattenOptionMapType<OptionsType[number]>,
197-
) => boolean;
192+
isValueDisabled: (value: RawValueType, options: FlattenOptionsType<OptionsType>) => boolean;
198193
warningProps?: (props: any) => void;
199194
fillOptionsWithMissingValue?: (
200195
options: OptionsType,
@@ -424,8 +419,6 @@ export default function generateSelector<
424419
[mergedOptions],
425420
);
426421

427-
const optionMap = useCacheOptions(mergedRawValue, mergedFlattenOptions);
428-
429422
// Display options for OptionList
430423
const displayOptions = React.useMemo<OptionsType>(() => {
431424
if (!mergedSearchValue || !mergedShowSearch) {
@@ -462,15 +455,15 @@ export default function generateSelector<
462455
() =>
463456
mergedRawValue.map((val: RawValueType) => {
464457
const displayValue = getLabeledValue(val, {
465-
optionMap,
458+
options: mergedFlattenOptions,
466459
prevValue: baseValue,
467460
labelInValue: mergedLabelInValue,
468461
optionLabelProp: mergedOptionLabelProp,
469462
});
470463

471464
return {
472465
...displayValue,
473-
disabled: isValueDisabled(val, optionMap),
466+
disabled: isValueDisabled(val, mergedFlattenOptions),
474467
};
475468
}),
476469
[baseValue, mergedOptions],
@@ -480,13 +473,13 @@ export default function generateSelector<
480473
displayValues = useCacheDisplayValue(displayValues);
481474

482475
const triggerSelect = (newValue: RawValueType, isSelect: boolean, source: SelectSource) => {
483-
const outOption = findValueOption([newValue], optionMap)[0];
476+
const outOption = findValueOption([newValue], mergedFlattenOptions)[0];
484477

485478
if (!internalProps.skipTriggerSelect) {
486479
// Skip trigger `onSelect` or `onDeselect` if configured
487480
const selectValue = (mergedLabelInValue
488481
? getLabeledValue(newValue, {
489-
optionMap,
482+
options: mergedFlattenOptions,
490483
prevValue: baseValue,
491484
labelInValue: mergedLabelInValue,
492485
optionLabelProp: mergedOptionLabelProp,
@@ -515,21 +508,18 @@ export default function generateSelector<
515508
return;
516509
}
517510

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-
);
511+
const outValues = toOuterValues<FlattenOptionsType<OptionsType>>(Array.from(newRawValues), {
512+
labelInValue: mergedLabelInValue,
513+
options: mergedFlattenOptions,
514+
getLabeledValue,
515+
prevValue: baseValue,
516+
optionLabelProp: mergedOptionLabelProp,
517+
});
528518

529519
const outValue: ValueType = (isMultiple ? outValues : outValues[0]) as ValueType;
530520
// Skip trigger if prev & current value is both empty
531521
if (onChange && (mergedRawValue.length !== 0 || outValues.length !== 0)) {
532-
const outOptions = findValueOption(newRawValues, optionMap);
522+
const outOptions = findValueOption(newRawValues, mergedFlattenOptions);
533523

534524
onChange(outValue, isMultiple ? outOptions : outOptions[0]);
535525
}

src/hooks/useCacheOptions.ts

Lines changed: 0 additions & 32 deletions
This file was deleted.

src/interface/generator.ts

Lines changed: 20 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,19 @@ export interface LabelValueType {
1414
value?: RawValueType;
1515
label?: React.ReactNode;
1616
}
17-
export type DefaultValueType = RawValueType | RawValueType[] | LabelValueType | LabelValueType[];
17+
export type DefaultValueType =
18+
| RawValueType
19+
| RawValueType[]
20+
| LabelValueType
21+
| LabelValueType[];
1822

1923
export interface DisplayLabelValueType extends LabelValueType {
2024
disabled?: boolean;
2125
}
2226

23-
export type SingleType<MixType> = MixType extends (infer Single)[] ? Single : MixType;
27+
export type SingleType<MixType> = MixType extends (infer Single)[]
28+
? Single
29+
: MixType;
2430

2531
export type OnClear = () => void;
2632

@@ -33,10 +39,10 @@ export type CustomTagProps = {
3339
};
3440

3541
// ==================================== Generator ====================================
36-
export type GetLabeledValue<FOT extends FlattenOptionMapType> = (
42+
export type GetLabeledValue<FOT extends FlattenOptionsType> = (
3743
value: RawValueType,
3844
config: {
39-
optionMap: FOT;
45+
options: FOT;
4046
prevValue: DefaultValueType;
4147
labelInValue: boolean;
4248
optionLabelProp: string;
@@ -53,12 +59,19 @@ export type FilterOptions<OptionsType extends object[]> = (
5359
},
5460
) => OptionsType;
5561

56-
export type FilterFunc<OptionType> = (inputValue: string, option?: OptionType) => boolean;
62+
export type FilterFunc<OptionType> = (
63+
inputValue: string,
64+
option?: OptionType,
65+
) => boolean;
5766

5867
export declare function RefSelectFunc<OptionsType extends object[], ValueType>(
59-
Component: React.RefForwardingComponent<RefSelectProps, SelectProps<OptionsType, ValueType>>,
68+
Component: React.RefForwardingComponent<
69+
RefSelectProps,
70+
SelectProps<OptionsType, ValueType>
71+
>,
6072
): React.ForwardRefExoticComponent<
61-
React.PropsWithoutRef<SelectProps<OptionsType, ValueType>> & React.RefAttributes<RefSelectProps>
73+
React.PropsWithoutRef<SelectProps<OptionsType, ValueType>> &
74+
React.RefAttributes<RefSelectProps>
6275
>;
6376

6477
export type FlattenOptionsType<OptionsType extends object[] = object[]> = {
@@ -67,8 +80,3 @@ export type FlattenOptionsType<OptionsType extends object[] = object[]> = {
6780
/** Used for customize data */
6881
[name: string]: any; // eslint-disable-line @typescript-eslint/no-explicit-any
6982
}[];
70-
71-
export type FlattenOptionMapType<OptionType extends object = object> = Map<
72-
DefaultValueType,
73-
OptionType
74-
>;

src/utils/commonUtil.ts

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import {
33
GetLabeledValue,
44
LabelValueType,
55
DefaultValueType,
6-
FlattenOptionMapType,
6+
FlattenOptionsType,
77
} from '../interface/generator';
88

99
export function toArray<T>(value: T | T[]): T[] {
@@ -27,8 +27,8 @@ export function toInnerValue(
2727
const values = Array.isArray(value) ? value : [value];
2828

2929
if (labelInValue) {
30-
return (values as LabelValueType[]).map(({ key, value: val }: LabelValueType) =>
31-
(val !== undefined ? val : key),
30+
return (values as LabelValueType[]).map(
31+
({ key, value: val }: LabelValueType) => (val !== undefined ? val : key),
3232
);
3333
}
3434

@@ -38,19 +38,19 @@ export function toInnerValue(
3838
/**
3939
* Convert internal value into out event value
4040
*/
41-
export function toOuterValues<FOT extends FlattenOptionMapType>(
41+
export function toOuterValues<FOT extends FlattenOptionsType>(
4242
valueList: RawValueType[],
4343
{
4444
optionLabelProp,
4545
labelInValue,
4646
prevValue,
47-
optionMap,
47+
options,
4848
getLabeledValue,
4949
}: {
5050
optionLabelProp: string;
5151
labelInValue: boolean;
5252
getLabeledValue: GetLabeledValue<FOT>;
53-
optionMap: FOT;
53+
options: FOT;
5454
prevValue: DefaultValueType;
5555
},
5656
): RawValueType[] | LabelValueType[] {
@@ -59,7 +59,7 @@ export function toOuterValues<FOT extends FlattenOptionMapType>(
5959
if (labelInValue) {
6060
values = values.map(val =>
6161
getLabeledValue(val, {
62-
optionMap,
62+
options,
6363
prevValue,
6464
labelInValue,
6565
optionLabelProp,
@@ -77,7 +77,11 @@ export function removeLastEnabledValue<
7777
const newValues = [...values];
7878

7979
let removeIndex: number;
80-
for (removeIndex = measureValues.length - 1; removeIndex >= 0; removeIndex -= 1) {
80+
for (
81+
removeIndex = measureValues.length - 1;
82+
removeIndex >= 0;
83+
removeIndex -= 1
84+
) {
8185
if (!measureValues[removeIndex].disabled) {
8286
break;
8387
}
@@ -97,7 +101,9 @@ export function removeLastEnabledValue<
97101
}
98102

99103
export const isClient =
100-
typeof window !== 'undefined' && window.document && window.document.documentElement;
104+
typeof window !== 'undefined' &&
105+
window.document &&
106+
window.document.documentElement;
101107

102108
/** Is client side and not jsdom */
103109
export const isBrowserClient = process.env.NODE_ENV !== 'test' && isClient;

src/utils/valueUtil.ts

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -89,16 +89,26 @@ function injectPropsWithOption<T>(option: T): T {
8989

9090
export function findValueOption(
9191
values: RawValueType[],
92-
optionMap: Map<RawValueType, OptionData>,
92+
options: FlattenOptionData[],
9393
): OptionData[] {
94+
const optionMap: Map<RawValueType, OptionData> = new Map();
95+
96+
options.forEach(flattenItem => {
97+
if (!flattenItem.group) {
98+
const data = flattenItem.data as OptionData;
99+
// Check if match
100+
optionMap.set(data.value, data);
101+
}
102+
});
103+
94104
return values.map(val => injectPropsWithOption(optionMap.get(val)));
95105
}
96106

97-
export const getLabeledValue: GetLabeledValue<Map<RawValueType, OptionData>> = (
107+
export const getLabeledValue: GetLabeledValue<FlattenOptionData[]> = (
98108
value,
99-
{ optionMap, prevValue, labelInValue, optionLabelProp },
109+
{ options, prevValue, labelInValue, optionLabelProp },
100110
) => {
101-
const item = findValueOption([value], optionMap)[0];
111+
const item = findValueOption([value], options)[0];
102112
const result: LabelValueType = {
103113
value,
104114
};
@@ -235,11 +245,8 @@ export function getSeparatedContent(text: string, tokens: string[]): string[] {
235245
return match ? list : null;
236246
}
237247

238-
export function isValueDisabled(
239-
value: RawValueType,
240-
optionMap: Map<RawValueType, OptionData>,
241-
): boolean {
242-
const option = findValueOption([value], optionMap)[0];
248+
export function isValueDisabled(value: RawValueType, options: FlattenOptionData[]): boolean {
249+
const option = findValueOption([value], options)[0];
243250
return option.disabled;
244251
}
245252

0 commit comments

Comments
 (0)