Skip to content

Commit 15700a1

Browse files
authored
chore: Cache display label (#484)
* test driven * cache with label
1 parent 40ff5f3 commit 15700a1

File tree

4 files changed

+54
-3
lines changed

4 files changed

+54
-3
lines changed

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@
5050
"warning": "^4.0.3"
5151
},
5252
"devDependencies": {
53+
"@types/enzyme": "^3.10.5",
5354
"@types/jest": "^25.1.0",
5455
"@types/react": "^16.8.19",
5556
"@types/react-dom": "^16.8.4",

src/generate.tsx

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ import useDelayReset from './hooks/useDelayReset';
3939
import useLayoutEffect from './hooks/useLayoutEffect';
4040
import { getSeparatedContent } from './utils/valueUtil';
4141
import useSelectTriggerControl from './hooks/useSelectTriggerControl';
42+
import useCacheDisplayValue from './hooks/useCacheDisplayValue';
4243

4344
const DEFAULT_OMIT_PROPS = [
4445
'removeIcon',
@@ -450,7 +451,7 @@ export default function generateSelector<
450451
}, [mergedSearchValue]);
451452

452453
// ============================ Selector ============================
453-
const displayValues = React.useMemo<DisplayLabelValueType[]>(
454+
let displayValues = React.useMemo<DisplayLabelValueType[]>(
454455
() =>
455456
mergedRawValue.map((val: RawValueType) => {
456457
const displayValue = getLabeledValue(val, {
@@ -468,6 +469,9 @@ export default function generateSelector<
468469
[baseValue, mergedOptions],
469470
);
470471

472+
// Polyfill with cache label
473+
displayValues = useCacheDisplayValue(displayValues);
474+
471475
const triggerSelect = (newValue: RawValueType, isSelect: boolean, source: SelectSource) => {
472476
const outOption = findValueOption([newValue], mergedFlattenOptions)[0];
473477

@@ -781,10 +785,13 @@ export default function generateSelector<
781785
};
782786

783787
const activeTimeoutIds: number[] = [];
784-
React.useEffect(() => () => {
788+
React.useEffect(
789+
() => () => {
785790
activeTimeoutIds.forEach(timeoutId => clearTimeout(timeoutId));
786791
activeTimeoutIds.splice(0, activeTimeoutIds.length);
787-
}, []);
792+
},
793+
[],
794+
);
788795

789796
const onInternalMouseDown: React.MouseEventHandler<HTMLDivElement> = (event, ...restArgs) => {
790797
const { target } = event;

src/hooks/useCacheDisplayValue.ts

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
import * as React from 'react';
2+
import { DisplayLabelValueType } from '../interface/generator';
3+
4+
export default function useCacheDisplayValue(
5+
values: DisplayLabelValueType[],
6+
): DisplayLabelValueType[] {
7+
const prevValuesRef = React.useRef(values);
8+
9+
const mergedValues = React.useMemo(() => {
10+
// Create value - label map
11+
const valueLabels = new Map();
12+
prevValuesRef.current.forEach(({ value, label }) => {
13+
if (value !== label) {
14+
valueLabels.set(value, label);
15+
}
16+
});
17+
18+
const resultValues = values.map(item => {
19+
const cacheLabel = valueLabels.get(item.value);
20+
if (item.value === item.label && cacheLabel) {
21+
return {
22+
...item,
23+
label: cacheLabel,
24+
};
25+
}
26+
27+
return item;
28+
});
29+
30+
prevValuesRef.current = resultValues;
31+
return resultValues;
32+
}, [values]);
33+
34+
return mergedValues;
35+
}

tests/Select.test.tsx

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1599,4 +1599,12 @@ describe('Select.Basic', () => {
15991599
toggleOpen(wrapper);
16001600
expect(wrapper.find('.rc-select-selection-placeholder').length).toBeFalsy();
16011601
});
1602+
1603+
it('Remove options can keep the cache', () => {
1604+
const wrapper = mount(<Select value={903} options={[{ value: 903, label: 'Bamboo' }]} />);
1605+
expect(findSelection(wrapper).text()).toEqual('Bamboo');
1606+
1607+
wrapper.setProps({ options: [] });
1608+
expect(findSelection(wrapper).text()).toEqual('Bamboo');
1609+
});
16021610
});

0 commit comments

Comments
 (0)