应用场景描述:Antd3X版本,想要实现form中的 Select 多选最多只能选3个。
1、方案1:setFieldsValue(适用Antd4X版本)
起初是想在Select的onchange事件中判断values的数量,数量大于三个的时候来重新setFieldsValue。
后来发现在Antd3X版本中 setFieldsValue方法不起作用,Select的值还是会一直增加。
但是试了Antd4X版本,这种方案是可行的,代码如下:
import { Form, message, Select } from 'antd';
import React from 'react';
import _ from 'lodash'
const { Option } = Select;
const App = () => {
const [form] = Form.useForm();
const handleChange = (value) => {
if (value.length > 3) {
message.error('已超过最大数量');
form.setFieldsValue({
"list": _.take(value, 3),
})
}
};
return (
<Form form={form}>
<Form.Item
name="list"
label="多选:(最多选3个)"
rules={[{
required: true
}]}
>
<Select
mode="multiple"
placeholder="请选择"
onChange={handleChange}
>
<Option value="111">111</Option>
<Option value="222">222</Option>
<Option value="333">333</Option>
<Option value="444">444</Option>
</Select>
</Form.Item>
</Form>
);
};
export default App;
2、方案2:pop(适用Antd3X、4X版本)
再后来看到这个文章:https://blog.youkuaiyun.com/m0_45219210/article/details/128573600
亲测好用,方法如下:就是在 onChange 事件中判断选中值的数量,如果大于3,则调用 pop() 方法。
代码如下:
const handleChange = (value) => {
if (value.length > 3) {
message.error('已超过最大数量');
value.pop();
}
};
3、方案3:validator(适用Antd3X版本)
参考文章:https://www.bbsmax.com/A/q4zVEqDGdK/
把Select标签上的onChange去掉,然后在 rules 中添加 validator 【它是自定义校验(3X版本中注意,callback 必须被调用,4X版本略有不同)】
代码如下:
import { Form, message, Select } from 'antd';
import React from 'react';
import _ from 'lodash'
const { Option } = Select;
const App = () => {
const [form] = Form.useForm();
const handleChange = (rule, value, callback) => {
if (value.length > 3) {
message.error('已超过最大数量');
form.setFieldsValue({
"list": _.take(value, 3),
})
callback('已超过最大数量...')
} else {
callback()
}
};
return (
<Form form={form}>
<Form.Item
name="list"
label="多选:(最多选3个)"
rules={[{
required: true,
validator: handleChange
}]}
>
<Select
mode="multiple"
placeholder="请选择"
>
<Option value="111">111</Option>
<Option value="222">222</Option>
<Option value="333">333</Option>
<Option value="444">444</Option>
</Select>
</Form.Item>
</Form>
);
};
export default App;