Skip to content

Commit 62bbe3c

Browse files
authored
feat: optimize search (#530)
* feat: optimize search * feat: test * feat: test * feat: test * feat: test * feat: add test
1 parent 8f927bb commit 62bbe3c

File tree

5 files changed

+72
-6
lines changed

5 files changed

+72
-6
lines changed

docs/demo/multiple-search.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
---
2+
title: multiple-search
3+
nav:
4+
title: Demo
5+
path: /demo
6+
---
7+
8+
<code src="../../examples/multiple-search.tsx"></code>

examples/multiple-search.tsx

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
import React from 'react';
2+
import '../assets/index.less';
3+
import Cascader from '../src';
4+
5+
const options = [
6+
{
7+
value: 'zhejiang',
8+
label: 'Zhejiang',
9+
children: [
10+
{
11+
value: 'hangzhou',
12+
label: 'Hangzhou',
13+
children: [
14+
{
15+
value: 'xihu',
16+
label: 'West Lake',
17+
},
18+
{
19+
value: 'xiasha',
20+
label: 'Xia Sha',
21+
},
22+
],
23+
},
24+
],
25+
},
26+
{
27+
value: 'jiangsu',
28+
label: 'Jiangsu',
29+
children: [
30+
{
31+
value: 'nanjing',
32+
label: 'Nanjing',
33+
children: [
34+
{
35+
value: 'zhonghuamen',
36+
label: 'Zhong Hua men',
37+
},
38+
],
39+
},
40+
],
41+
},
42+
];
43+
44+
const Demo = () => {
45+
return <Cascader checkable showSearch options={options} />;
46+
};
47+
48+
export default Demo;

src/Cascader.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -280,7 +280,7 @@ const Cascader = React.forwardRef<CascaderRef, InternalCascaderProps>((props, re
280280
mergedFieldNames,
281281
dropdownPrefixCls || prefixCls,
282282
searchConfig,
283-
changeOnSelect,
283+
changeOnSelect || multiple,
284284
);
285285

286286
// =========================== Values ===========================

src/hooks/useSearchOptions.ts

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,13 @@ const defaultFilter: ShowSearchType['filter'] = (search, options, { label = '' }
99
const defaultRender: ShowSearchType['render'] = (inputValue, path, prefixCls, fieldNames) =>
1010
path.map(opt => opt[fieldNames.label as string]).join(' / ');
1111

12-
export default (
12+
const useSearchOptions = (
1313
search: string,
1414
options: DefaultOptionType[],
1515
fieldNames: InternalFieldNames,
1616
prefixCls: string,
1717
config: ShowSearchType,
18-
changeOnSelect?: boolean,
18+
enableHalfPath?: boolean,
1919
) => {
2020
const { filter = defaultFilter, render = defaultRender, limit = 50, sort } = config;
2121

@@ -46,8 +46,8 @@ export default (
4646
// If is leaf option
4747
!children ||
4848
children.length === 0 ||
49-
// If is changeOnSelect
50-
changeOnSelect
49+
// If is changeOnSelect or multiple
50+
enableHalfPath
5151
) {
5252
if (filter(search, connectedPathOptions, { label: fieldNames.label })) {
5353
filteredOptions.push({
@@ -87,5 +87,7 @@ export default (
8787
return limit !== false && limit > 0
8888
? filteredOptions.slice(0, limit as number)
8989
: filteredOptions;
90-
}, [search, options, fieldNames, prefixCls, render, changeOnSelect, filter, sort, limit]);
90+
}, [search, options, fieldNames, prefixCls, render, enableHalfPath, filter, sort, limit]);
9191
};
92+
93+
export default useSearchOptions;

tests/search.spec.tsx

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,14 @@ describe('Cascader.Search', () => {
202202
wrapper.find('.rc-cascader-menu-item').first().simulate('click');
203203
wrapper.find('.rc-cascader-menu-item').first().simulate('mousedown');
204204
expect(onChange).toHaveBeenCalledWith([['bamboo', 'little', 'fish']], expect.anything());
205+
206+
doSearch(wrapper, 'light');
207+
wrapper.find('.rc-cascader-menu-item').first().simulate('click');
208+
wrapper.find('.rc-cascader-menu-item').first().simulate('mousedown');
209+
expect(onChange).toHaveBeenCalledWith(
210+
[['bamboo', 'little', 'fish'], ['light']],
211+
expect.anything(),
212+
);
205213
});
206214

207215
it('should not crash when exist options with same value on different levels', () => {

0 commit comments

Comments
 (0)