项目中提到的一个需求,限制TreeSelect的选择个数,例如选择国家,最多只能选择三个。
想到的办法有好几个,例如在选择的时候判断已选择的个数,如果有三个了就将TreeSelect的disabled设为true,但是这个方法会导致不能修改,例如想换一个国家,控制起来反反复复比较麻烦。
后来找到一个其他方法,在一个文章里看到的,作者忘记了(抱歉);
先把最优解决办法放上来吧。
Form表单有一个validator方法,此方法可以获取到TreeSelect已经选择的值以及长度
<Col {...ColLayout}>
<Form.Item label="国家地区" {...formItemLayout}>
{getFieldDecorator("gjid", {
initialValue: data && data.gjid ? data.gjid.split(',') : [],
rules: [
{
required: true,
message: '请选择国家地区',
validator: this.changeValues , //此行为重要方法!!!!!!!!!!!
}
]
})(
<TreeSelect
style={{ width: '100%' }}
treeData={country}
placeholder="请选择"
treeNodeFilterProp="title"
multiple
showSearch
onChange={this.changeGJ}
// disabled={gjDisabled}
/>
)}
</Form.Item>
</Col>
changeValues = (rule, value, callback) => {
const { setFieldsValue } = this.props.form;
let newArr; //定义一个空数组,将超过三个后截取的值赋给form
//判断如果值超过三个
if (value.length > 3) {
//如果超过三个,那么就使用slice截取,只取前三个
newArr = [].concat(value.slice(0, 3));
//将截取后的值赋给form表单内的gjid
setFieldsValue({
"gjid": newArr,
})
//并给出提示
message.warning('最多选择三个国家!')
} else {
newArr = value;
callback()
}
}
记录下这篇文章的时候突然想到,在onChange事件里面使用这样的方法是不是也可以呢,这就去试一下,在onChange事件里面判断长度然后截取。
但是Form表单的这个validator方法之前没有见过,还是好神奇。