Skip to content

Commit 888b95e

Browse files
author
刘欢
committed
feat: use hooks => useSearchConfig
1 parent 210d6e6 commit 888b95e

File tree

2 files changed

+60
-18
lines changed

2 files changed

+60
-18
lines changed

src/Select.tsx

Lines changed: 20 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ import type { FlattenOptionData } from './interface';
5656
import { hasValue, isComboNoValue, toArray } from './utils/commonUtil';
5757
import { fillFieldNames, flattenOptions, injectPropsWithOption } from './utils/valueUtil';
5858
import warningProps, { warningNullOptions } from './utils/warningPropsUtil';
59+
import useSearchConfig from './hooks/useSearchConfig';
5960

6061
const OMIT_DOM_PROPS = ['inputValue'];
6162

@@ -110,7 +111,7 @@ type ArrayElementType<T> = T extends (infer E)[] ? E : T;
110111

111112
export type SemanticName = BaseSelectSemanticName;
112113
export type PopupSemantic = 'listItem' | 'list';
113-
interface SearchConfig<OptionType> {
114+
export interface SearchConfig<OptionType> {
114115
searchValue?: string;
115116
autoClearSearchValue?: boolean;
116117
onSearch?: (value: string) => void;
@@ -222,21 +223,22 @@ const Select = React.forwardRef<BaseSelectRef, SelectProps<any, DefaultOptionTyp
222223
...restProps
223224
} = props;
224225

225-
const legacySearchProps = [
226-
'filterOption',
227-
'searchValue',
228-
'optionFilterProp',
229-
'optionLabelProp',
230-
'filterSort',
231-
'onSearch',
232-
'autoClearSearchValue',
233-
'tokenSeparators',
234-
];
235-
const legacyShowSearch: SearchConfig<DefaultOptionType> = {};
236-
legacySearchProps.forEach((propsName) => {
237-
legacyShowSearch[propsName] = props?.[propsName];
238-
});
239-
const mergedShowSearch = typeof showSearch === 'object' ? showSearch : legacyShowSearch;
226+
// const legacySearchProps = [
227+
// 'filterOption',
228+
// 'searchValue',
229+
// 'optionFilterProp',
230+
// 'optionLabelProp',
231+
// 'filterSort',
232+
// 'onSearch',
233+
// 'autoClearSearchValue',
234+
// 'tokenSeparators',
235+
// ];
236+
// const legacyShowSearch: SearchConfig<DefaultOptionType> = {};
237+
// legacySearchProps.forEach((propsName) => {
238+
// legacyShowSearch[propsName] = props?.[propsName];
239+
// });
240+
const [mergedShowSearch, searchConfig] = useSearchConfig(showSearch, props);
241+
// const mergedShowSearch = typeof showSearch === 'object' ? showSearch : legacyShowSearch;
240242
const {
241243
filterOption,
242244
searchValue,
@@ -246,7 +248,7 @@ const Select = React.forwardRef<BaseSelectRef, SelectProps<any, DefaultOptionTyp
246248
onSearch,
247249
autoClearSearchValue = true,
248250
tokenSeparators,
249-
} = mergedShowSearch;
251+
} = searchConfig;
250252

251253
const mergedId = useId(id);
252254
const multiple = isMultiple(mode);
@@ -719,7 +721,7 @@ const Select = React.forwardRef<BaseSelectRef, SelectProps<any, DefaultOptionTyp
719721
// >>> Trigger
720722
direction={direction}
721723
// >>> Search
722-
showSearch={showSearch === undefined ? undefined : !!showSearch}
724+
showSearch={mergedShowSearch}
723725
searchValue={mergedSearchValue}
724726
onSearch={onInternalSearch}
725727
autoClearSearchValue={autoClearSearchValue}

src/hooks/useSearchConfig.ts

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
import type { SearchConfig, DefaultOptionType } from '@/Select';
2+
import * as React from 'react';
3+
const legacySearchProps = [
4+
'filterOption',
5+
'searchValue',
6+
'optionFilterProp',
7+
'optionLabelProp',
8+
'filterSort',
9+
'onSearch',
10+
'autoClearSearchValue',
11+
'tokenSeparators',
12+
];
13+
// Convert `showSearch` to unique config
14+
export default function useSearchConfig(showSearch, props) {
15+
return React.useMemo<[boolean, SearchConfig<DefaultOptionType>]>(() => {
16+
const legacyShowSearch: SearchConfig<DefaultOptionType> = {};
17+
legacySearchProps.forEach((propsName) => {
18+
legacyShowSearch[propsName] = props?.[propsName];
19+
});
20+
const searchConfig: SearchConfig<DefaultOptionType> =
21+
typeof showSearch === 'object' ? showSearch : legacyShowSearch;
22+
if (showSearch === undefined) {
23+
return [undefined, searchConfig];
24+
}
25+
if (!showSearch) {
26+
return [false, {}];
27+
}
28+
return [true, searchConfig];
29+
}, [
30+
showSearch,
31+
props?.filterOption,
32+
props?.searchValue,
33+
props?.optionFilterProp,
34+
props?.optionLabelProp,
35+
props?.filterSort,
36+
props?.onSearch,
37+
props?.autoClearSearchValue,
38+
props?.tokenSeparators,
39+
]);
40+
}

0 commit comments

Comments
 (0)