Skip to content

Commit 8e8bf3d

Browse files
authored
feat(SearchTree): 增加valueAmount参数限制最大value长度 (#722)
1 parent 18f94a8 commit 8e8bf3d

File tree

2 files changed

+124
-13
lines changed

2 files changed

+124
-13
lines changed

‎packages/react-search-select/README.md

Lines changed: 116 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,6 @@ function handleSearch(e) {
5757
maxTagCount={6}
5858
allowClear
5959
value={values}
60-
disabled={false}
6160
placeholder="请输入选择"
6261
onSearch={handleSearch}
6362
// onSelect={(value)=>console.log('onSelect',value)}
@@ -78,7 +77,6 @@ function handleSearch(e) {
7877
maxTagCount={6}
7978
allowClear
8079
value={value}
81-
disabled={false}
8280
placeholder="请输入选择"
8381
onSearch={handleSearch}
8482
// onSelect={(value)=>console.log('onSelect',value)}
@@ -90,6 +88,14 @@ function handleSearch(e) {
9088
}}
9189
/>
9290
</Row>
91+
<Row>
92+
<SearchSelect
93+
mode="single"
94+
style={{ width: 200 }}
95+
placeholder="请输入选择"
96+
disabled={true}
97+
/>
98+
</Row>
9399
</Row>
94100
);
95101
};
@@ -115,11 +121,10 @@ const Demo = () => {
115121
{ label: 'a8', value: 8 },
116122
]
117123

124+
const valueAmount = 2
118125
const [option, setOption] = React.useState(selectOption);
119126
const [loading, setLoading] = React.useState(false);
120-
const [values, setValues] = React.useState([{label: 'a7', value: 7}]);
121-
const [disabled, setDisabled] = React.useState(false);
122-
const maxTagCount = 2
127+
const [values, setValues] = React.useState([ 1, 2, 7]);
123128

124129
function handleSearch(e) {
125130
setLoading(true)
@@ -131,7 +136,70 @@ const Demo = () => {
131136
}
132137

133138
return(
134-
<Row gutter={20}>
139+
<Row style={{ marginLeft: 10 }}>
140+
<SearchSelect
141+
mode="multiple"
142+
style={{ width: 200 }}
143+
showSearch={true}
144+
valueAmount={valueAmount}
145+
allowClear
146+
value={values}
147+
placeholder="请输入选择"
148+
onSearch={handleSearch}
149+
// onSelect={(value)=>console.log('onSelect',value)}
150+
loading={loading}
151+
option={option}
152+
onChange={(value) => {
153+
setValues(value)
154+
}}
155+
/>
156+
</Row>
157+
);
158+
};
159+
ReactDOM.render(<Demo />, _mount_);
160+
```
161+
162+
## 显示最大数量
163+
164+
<!--rehype:bgWhite=true&codeSandbox=true&codePen=true-->
165+
```jsx
166+
import ReactDOM from 'react-dom';
167+
import { SearchSelect,Row,Col } from 'uiw';
168+
169+
const Demo = () => {
170+
const selectOption=[
171+
{ label: 'a1', value: 1 },
172+
{ label: 'a2', value: 2 },
173+
{ label: 'a3', value: 3 },
174+
{ label: 'a4', value: 4 },
175+
{ label: 'a5', value: 5 },
176+
{ label: 'a6', value: 6 },
177+
{ label: 'a7', value: 7 },
178+
{ label: 'a8', value: 8 },
179+
]
180+
181+
const maxTagCount = 4
182+
const [option, setOption] = React.useState(selectOption);
183+
const [loading, setLoading] = React.useState(false);
184+
const [values, setValues] = React.useState([
185+
{ label: 'a1', value: 1 },
186+
{ label: 'a2', value: 2 },
187+
{ label: 'a5', value: 5 },
188+
{ label: 'a7', value: 7 },
189+
{ label: 'a8', value: 8 },
190+
]);
191+
192+
function handleSearch(e) {
193+
setLoading(true)
194+
setTimeout(() => {
195+
const filterOpion= selectOption.filter(item=>!!item.label.includes(e.trim()))
196+
setOption([...filterOpion]);
197+
setLoading(false);
198+
}, 500);
199+
}
200+
201+
return(
202+
<Row style={{ marginLeft: 10 }}>
135203
<SearchSelect
136204
mode="multiple"
137205
style={{ width: 200 }}
@@ -140,15 +208,11 @@ const Demo = () => {
140208
maxTagCount={maxTagCount}
141209
allowClear
142210
value={values}
143-
disabled={disabled}
144211
placeholder="请输入选择"
145212
onSearch={handleSearch}
146-
// onSelect={(value)=>console.log('onSelect',value)}
147213
loading={loading}
148214
option={option}
149215
onChange={(value) => {
150-
if(value?.length >= maxTagCount)
151-
setDisabled(true)
152216
setValues(value)
153217
}}
154218
/>
@@ -158,6 +222,47 @@ const Demo = () => {
158222
ReactDOM.render(<Demo />, _mount_);
159223
```
160224

225+
## 不可搜索
226+
227+
<!--rehype:bgWhite=true&codeSandbox=true&codePen=true-->
228+
```jsx
229+
import ReactDOM from 'react-dom';
230+
import { SearchSelect,Row,Col } from 'uiw';
231+
232+
const Demo = () => {
233+
const selectOption=[
234+
{ label: 'a1', value: 1 },
235+
{ label: 'a2', value: 2 },
236+
{ label: 'a3', value: 3 },
237+
{ label: 'a4', value: 4 },
238+
{ label: 'a5', value: 5 },
239+
{ label: 'a6', value: 6 },
240+
{ label: 'a7', value: 7 },
241+
{ label: 'a8', value: 8 },
242+
]
243+
244+
const [values, setValues] = React.useState([1,7]);
245+
246+
return(
247+
<Row style={{ marginLeft: 10 }}>
248+
<SearchSelect
249+
mode="multiple"
250+
style={{ width: 200 }}
251+
showSearch={true}
252+
labelInValue={false}
253+
showSearch={false}
254+
placeholder="请输入选择"
255+
value={values}
256+
option={selectOption}
257+
onChange={(value) => {
258+
setValues(value)
259+
}}
260+
/>
261+
</Row>
262+
);
263+
};
264+
ReactDOM.render(<Demo />, _mount_);
265+
```
161266

162267
### 在表单中使用
163268

@@ -307,3 +412,4 @@ ReactDOM.render(<Demo />, _mount_);
307412
| onSearch | 文本框值变化时回调 | function(value: String) | - | - |
308413
| onSelect | 被选中时调用,参数为选中项的 value | function(value: String/Number ) | - | - |
309414
| loading | 加载中状态 | Boolean | `false` | - |
415+
| valueAmount | 多选模式下,限制最多选择多少个(value的长度) | number | - | - |

‎packages/react-search-select/src/index.tsx

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ export interface SearchSelectProps extends IProps, DropdownProps {
1515
mode?: 'single' | 'multiple';
1616
size?: 'large' | 'default' | 'small';
1717
maxTagCount?: number;
18+
valueAmount?: number;
1819
labelInValue?: boolean;
1920
loading?: boolean;
2021
showSearch?: boolean;
@@ -38,9 +39,10 @@ export default function SearchSelect(props: SearchSelectProps) {
3839
const {
3940
allowClear = false,
4041
disabled = false,
42+
valueAmount,
4143
size = 'default',
42-
maxTagCount,
4344
option = [],
45+
maxTagCount,
4446
loading = false,
4547
labelInValue = false,
4648
prefixCls = 'w-search-select',
@@ -125,7 +127,7 @@ export default function SearchSelect(props: SearchSelectProps) {
125127
}
126128

127129
if (!isMultiple && opts.length > 0) setSelectedLabel(opts[0].label || '');
128-
setSelectedValue(opts);
130+
setSelectedValue(opts.slice(0, valueAmount));
129131
}
130132

131133
function removeSelectItem(index: number) {
@@ -149,7 +151,10 @@ export default function SearchSelect(props: SearchSelectProps) {
149151
}
150152

151153
function handleItemsClick(index: number, item?: SearchSelectOptionData) {
152-
let values: SearchSelectOptionData[] = index !== -1 ? removeSelectItem(index) : [...selectedValue, item!];
154+
let values: SearchSelectOptionData[] =
155+
index !== -1
156+
? removeSelectItem(index)
157+
: [...selectedValue.slice(0, valueAmount ? valueAmount - 1 : undefined), item!];
153158
const resultValue = values.map((item) => item.value);
154159
handleChange(resultValue, values);
155160
}

0 commit comments

Comments
 (0)