vue.js

关注公众号 jb51net

关闭
首页 > 网络编程 > JavaScript > javascript类库 > vue.js > antd select 限制个数

antd select 多选限制个数的实现代码

作者:一晌贪欢i

这篇文章主要介绍了antd select 多选限制个数,实现思路和核心代码都很简单,其中核心代码在于disabled,代码简单易懂需要的朋友可以参考下

antd select 多选限制个数

直接给出源码

<template>
       <a-select
              v-model="college"
              mode="multiple"
              :maxTagCount="2"
              autocomplete="off"
              style="width: 252px;margin-top:10px;margin-right: 28px"
              :getPopupContainer="triggerNode => triggerNode.parentNode"
            >
              <a-select-option
                v-for="item in collegeList"
                :key="item.id"
                :value="item.name"
                :disabled="college.length >= 5 && college.findIndex(o => o === item.name) === -1"
              >
                {{ item.name }}
              </a-select-option>
          </a-select>
</template>
 <script>  
	 data() {
	    return { 
	      collegeList: [],
	      college: []
	    }
	  },
 </script>  

其中核心代码在于disabled
其中 collegeList数据结构

[
  {
    "city": "北京市",
    "code": "4111010001",
    "createBy": null,
    "createTime": null,
    "department": "教育部",
    "id": 1,
    "level": "本科",
    "name": "北京大学",
    "updateBy": null,
    "updateTime": null
  },
  {
    "city": "北京市",
    "code": "4111010002",
    "createBy": null,
    "createTime": null,
    "department": "教育部",
    "id": 2,
    "level": "本科",
    "name": "中国人民大学",
    "updateBy": null,
    "updateTime": null
  },
  {
    "city": "北京市",
    "code": "4111010003",
    "createBy": null,
    "createTime": null,
    "department": "教育部",
    "id": 3,
    "level": "本科",
    "name": "清华大学",
    "updateBy": null,
    "updateTime": null
  }
]

再看一个复杂一点的例子:

		<a-select
              v-model="safeGroup"
              mode="multiple"
              placeholder="请选择安全组"
              class="long-input"
              :getPopupContainer="triggerNode => triggerNode.parentNode"
              @change="handleSafeChange"
            >
              <a-select-option
                v-for="item in SafeGroupList"
                :key="item.safeGroupId"
                :value="JSON.stringify(item)"
                :disabled="
                  safeGroup.length >= 5 &&
                  safeGroup.findIndex(o => JSON.parse(o).safeGroupId === item.safeGroupId) === -1
                "
              >
                <ellipsis :length="20"> {{ item.safeGroupName }}</ellipsis>
              </a-select-option>
             
            </a-select>

其中对v-model绑定的数据处理在@chang方法里

handleSafeChange(e) {
    if (e) {
      this.dispalySafe = false
      this.safeGroup = e
      const arr1 = e.map(x => {
        return JSON.parse(x)
      })
      const arr2 = e.map(x => {
        return JSON.parse(x).safeGroupId
      })
      this.$emit('handleSafeChange', arr2, arr1)
    }
  },

关于antd Select 限制选择个数的解决方案

应用场景描述:

Select 被form 所包裹,且被getFieldDecorator修饰。所以值的改变应该通过form的setFieldsValue方法。

Select模式肯定会是multiple。且以最多三个值举例。

解决思路如下:

1 起初是想在Select的onchange事件中判断values的数量,数量大于三个的时候来重新setFieldsValue;且把最后的选项值替换成刚刚选择的值。

后来发现setFieldsValue方法不起作用,Select的值会一直增加。后来想想可能是 setFieldsValue与onchange 冲突,通过setFieldsValue 无法改变onchange后的值。

2 最后通过重新查看文档。发现还有一个方法可用,即 validator。验证值,通过验证所选值的数量是否大于三个,然后重新setFieldsValue ;发现此法可行。从而解决该疑难杂症。

好,最后附上代码供参考:

changeValues = (rule ,value , callback)=> {

const { setFieldsValue } = this.props.form ;

let newArr ;

if (value.length > 3){

newArr = [].concat(value.slice(0,2), value.slice(-1) ) ;

setFieldsValue({

"languages" : newArr ,

})

callback(‘最多选择三种语言‘)

} else {

newArr = value ;

callback()

}

}

{getFieldDecorator(‘languages‘, {

rules:[{required: true,message : ‘请选择三种语言‘,

validator : changeValues

}],

validateTrigger : ‘onChange‘,

})(

1

2

3

4

5

)}

到此这篇关于antd select 多选限制个数的文章就介绍到这了,更多相关antd select 限制个数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文