vant 2 + vue,Checkbox 复选框如何实现:当只有最后一个复选框的时候点击它不可取消勾选的功能

vant 2 + vue,Checkbox 复选框如何实现:当只有最后一个复选框的时候点击它不可取消勾选的功能。
试过不用v-model替换为v-bind:value的方式,但这样并不会触发change,甚至使复选框都无法勾选。
求了解的带佬指点一下

img

  • 以下回答由chatgpt基于相关博客总结生成:

    解决方案

    要实现点击最后一个复选框不可取消勾选的功能,可以通过在点击事件中判断是否为最后一个复选框来控制是否取消勾选。

    1. 首先,修改复选框的绑定值为数组形式,用来保存被选中的复选框的值。例如:v-model="checkedItems"

    2. 在点击事件中,判断点击的复选框是否为最后一个复选框。若是最后一个复选框,则判断当前状态是选中还是取消选中,如果是取消选中,则将其强制设置为选中状态;如果是选中,则正常处理。这样可以实现最后一个复选框不可取消勾选的功能。

    下面是示例代码:

    <template>
      <div>
        <van-checkbox-group v-model="checkedItems">
          <van-checkbox
            v-for="(item, index) in checkboxOptions"
            :key="index"
            :disabled="isLastCheckbox(index)"
            :value="item.value"
            @change="handleCheckboxChange"
          >
            {{ item.label }}
          </van-checkbox>
        </van-checkbox-group>
      </div>
    </template>
    
    <script>
    export default {
      data() {
        return {
          checkboxOptions: [
            { value: '1', label: '选项1' },
            { value: '2', label: '选项2' },
            // 更多选项...
          ],
          checkedItems: [] // 保存被选中的复选框的值
        };
      },
      methods: {
        isLastCheckbox(index) {
          return index === this.checkboxOptions.length - 1;
        },
        handleCheckboxChange(val) {
          const lastCheckboxIndex = this.checkboxOptions.length - 1;
          if (val.length === lastCheckboxIndex) {
            // 最后一个复选框状态发生变化
            const lastCheckboxValue = this.checkboxOptions[lastCheckboxIndex].value;
            if (!val.includes(lastCheckboxValue)) {
              // 取消选中最后一个复选框时,强制设置为选中状态
              val.push(lastCheckboxValue);
            }
          }
          // 更新选中的复选框的值
          this.checkedItems = val;
        },
      },
    };
    </script>
    

    在上面的示例代码中,通过isLastCheckbox方法来判断是否为最后一个复选框,如果是,则在handleCheckboxChange方法中判断最后一个复选框的状态,并进行相应的处理。最后,将选中的复选框的值保存在checkedItems中,以便后续使用。

    这样就可以实现点击最后一个复选框不可取消勾选的功能了。

vant 2没有设置最小可选数这个配置,你可以试一下,剩选中最后一个的时候,把选中的那个禁用掉

img

当选中数量与选框数量相等时,判断为最后一个选中,找到最后一个选中的索引,赋值为禁选索引,disabled设置为禁选索引与当前遍历索引相等时禁选

img

<template>
  <div>
    <van-checkbox-group v-model="result" @change="changeCheck">
      <van-checkbox
        v-for="(item, index) in checkList"
        :key="index"
        :disabled="disabledIndex === index"
        :name="item.value">{{ item.label }}</van-checkbox>
    </van-checkbox-group>
  </div>
</template>

<script>

export default {
  data () {
    return {
      checkList: [
        { value: 'a', label: '复选框A' },
        { value: 'b', label: '复选框B' },
        { value: 'c', label: '复选框C' },
        { value: 'd', label: '复选框D' },
        { value: 'e', label: '复选框E' }
      ],
      disabledIndex: null,
      result: []
    }
  },
  created () {
  },
  methods: {
    changeCheck (val) {
      const { checkList } = this
      if (val.length === checkList.length) {
        const lastChecked = val[val.length - 1]
        const lastIndex = checkList.findIndex(item => item.value === lastChecked) // 找到最后选中的索引
        this.disabledIndex = lastIndex
      } else {
        this.disabledIndex = null
      }
    }
  }
}
</script>