最近项目开发中,有一个关于 checkbox多选框限制选择 个数的需求,具体要求如下:
具体需求:
- 多选框最多选4个
- 选满4个后,其他选项变成禁用
(disable)
状态- 取消已选择的选项后,可以继续选择其他选项
需求分析完后开始写代码实现:
项目使用Vue3,UI框架采用Ant-design-vue@4.x版本
- 在一组可选项中进行多项选择时;
- 单独使用可以表示两种状态之间的切换,和
switch
类似。区别在于切换switch
会直接触发状态改变,而checkbox
一般用于状态标记,需要和提交操作配合。
由于项目中的选项是从接口获取到的列表,所以用到了Ant-design-vue中的list组件。 看了Checkbox的文档后,用CheckboxGroup内嵌Checkbox实现比较方便: CheckboxGroup中的value选中的内容满足条件就可以将未选择的内容禁用,将Checkbox的disabled属性设为true即可。
源代码:
js
<template>
<a-checkbox-group v-model:value="selectedTeams">
<a-list :grid="{ gutter: 10, column: 5 }" :data-source="dataSource">
<template #renderItem="{ item }">
<a-list-item>
<template #extra>
<a-checkbox :value="item.id" name="team"
:disabled="(selectedTeams.length >= 4 && selectedTeams.includes(item.id) === false ? true : false)">{{ item.title }}</a-checkbox>
</template>
</a-list-item>
</template>
</a-list>
</a-checkbox-group>
</template>
<script steup>
const selectedTeams = ref([]) // 选中的球队
const dataSource = ref([
{ id: '1', title: '利物浦' },
{ id: '2', title: '曼城' },
{ id: '3', title: '阿森纳' },
{ id: '4', title: '维拉' },
{ id: '5', title: '热刺' },
{ id: '6', title: '曼联' },
{ id: '7', title: '纽卡斯尔' },
{ id: '8', title: '布莱顿' },
{ id: '9', title: '西汉姆联' },
{ id: '10', title: '切尔西' }
])
</script>
效果如下:
未选满4个时,其他选项还可以选择。
选满4个后,其他选项不可选择。
实现的关键点就是这句:
js
:disabled="(selectedTeams.length >= 4 && selectedTeams.includes(item.id) === false ? true : false)"
- 将每个选项与CheckboxGroup的值进行双向绑定
- 根据规则选择球队个数,来限制选择个数
- 利用ES6的 includes 判断所选球队的数组中是否含有对应的球队选项
- 通过两个条件取并集,用三目运算符来为disabled属性负值,所得到的结果即为最终效果
至此,需求就实现了。本例为根据项目需求模拟的案例。