vue2 el-checkbox-group复选框无法选中问题及解决

 更新时间:2024年05月28日 16:20:26   作者:小果子^_^  
这篇文章主要介绍了vue2 el-checkbox-group复选框无法选中问题及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

vue2 el-checkbox-group 复选框无法选中

原代码

<template slot-scope="scope">
  <el-checkbox v-model="scope.row.bitian">必填</el-checkbox>
</template>

if (this.allTemplateList && this.allTemplateList.length > 0) {
  this.allTemplateList.forEach(template => {
    template.bitian = false;
    template.number = '';
    template.shangchuandatas = [];
    template.wenjiandaxiao = '';
  })
},

修改后

在遍历 this.allTemplateList 时,使用 Vue.set 或 this.$set 来确保新添加的属性是响应式的

if (this.allTemplateList && this.allTemplateList.length > 0) {  
  this.allTemplateList.forEach((template, index) => {  
    this.$set(this.allTemplateList, index, {  
      ...template,  
      bitian: false,  
      number: '',  
      shangchuandatas: [],  
      wenjiandaxiao: '',  
    });  
  });  
}

多个el-checkbox-group复选框组 选项互斥

需求

多个el-checkbox-group复选框组 , 组与组之间的选项是互斥的效果

效果

在这里插入图片描述

代码实现(方法一)

  • template
<template>
  <div class="page">
    <el-checkbox-group
      v-for="(item, index) in list"
      v-model="item.checked"
      :key="index"
      @change="checkboxChange"
    >
      <el-checkbox
        v-for="(jitem, jindex) in item.checkData"
        :label="jitem.label"
        :key="jindex"
        :disabled="jitem.disabled"
        >{{ jitem.name }}</el-checkbox
      >
    </el-checkbox-group>
  </div>
</template>
  • script
<script>
export default {
  name: 'xxx',
  data() {
    return {
      list: [
        {
          checked: [], // 选中值
          checkData: [
            // 复选框
            { label: 'name1', name: '名称1', disabled: false },
            { label: 'name2', name: '名称2', disabled: false },
            { label: 'name3', name: '名称3', disabled: false }
          ]
        },
        {
          checked: [],
          checkData: [
            { label: 'name1', name: '名称1', disabled: false },
            { label: 'name4', name: '名称4', disabled: false },
            { label: 'name3', name: '名称3', disabled: false }
          ]
        },
        {
          checked: [],
          checkData: [
            { label: 'name1', name: '名称1', disabled: false },
            { label: 'name4', name: '名称4', disabled: false },
            { label: 'name3', name: '名称3', disabled: false }
          ]
        },
        {
          checked: [],
          checkData: [
            { label: 'name5', name: '名称5', disabled: false },
            { label: 'name1', name: '名称1', disabled: false },
            { label: 'name3', name: '名称3', disabled: false }
          ]
        }
      ]
    }
  },
  methods: {
    /**
     * @description 复选框change事件
     * @param {array} val 复选框值
     * @param {number} i 索引
     * @return {void} Do not return anything
     */
    checkboxChange() {
      let checkedAll = []// 存储所有的选中值
      this.list.forEach(item => {
        // 初始化数据,复选框都可选
        item.checkData.forEach(jitem => {
          jitem.disabled = false
        })
        // 将选中的数据存储arr中
        item.checked.forEach(kitem => {
          checkedAll.push(kitem)
        })
      })
      // 去重
      checkedAll = Array.from(new Set(checkedAll))
      // 互斥操作
      this.list.forEach(item => {
        item.checkData.forEach(jitem => {
          if (checkedAll.includes(jitem.label) && !item.checked.includes(jitem.label)) {
            // 当复选框对应数据存在arr中,不存在对应的checked中时,设为禁用状态
            jitem.disabled = true
          }
        })
      })
    }
  }
}
</script>

代码实现(方法二)

  • template
<template>
  <div class="page">
    <el-form>
      <el-form-item v-for="(item, index) in list" :label="'复选框组' + (index + 1)"  :key="index">
        <el-checkbox-group v-model="item.checked">
          <el-checkbox
            v-for="(jitem, jindex) in item.checkData"
            :label="jitem.label"
            :key="jindex"
            :disabled="setDisabledMuti(jitem, index)"
            >{{ jitem.name }}</el-checkbox>
        </el-checkbox-group>
      </el-form-item>
  </el-form>
  </div>
</template>
  • script
<script>
export default {
  name: 'xxx',
  data() {
    return {
      checkedAll: [],
      list: [
        {
          checked: ['name1'], // 选中值
          checkData: [
            // 复选框
            { label: 'name1', name: '名称1' },
            { label: 'name2', name: '名称2' },
            { label: 'name3', name: '名称3' }
          ]
        },
        {
          checked: ['name4'],
          checkData: [
            { label: 'name1', name: '名称1' },
            { label: 'name4', name: '名称4' },
            { label: 'name3', name: '名称3' }
          ]
        },
        {
          checked: ['name3'],
          checkData: [
            { label: 'name1', name: '名称1' },
            { label: 'name4', name: '名称4' },
            { label: 'name3', name: '名称3' }
          ]
        },
        {
          checked: ['name5'],
          checkData: [
            { label: 'name5', name: '名称5' },
            { label: 'name1', name: '名称1' },
            { label: 'name3', name: '名称3' }
          ]
        }
      ]
    }
  },
  //计算属性
  computed: {
    setDisabledMuti() {
      return function(opt, index) {
        // 全部已选择
        const tempArr = this.list.map(item => item.checked)
        // 先删除自己的已选
        tempArr.splice(index, 1)
        // 转为一维数组
        const selectedArr = tempArr.flat();
        // 其它的已选,禁用
        return selectedArr.includes(opt.label)
      }
    }
  }
}
</script>

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Vue前端实现导出页面为word的两种方法

    Vue前端实现导出页面为word的两种方法

    这篇文章主要介绍了Vue前端实现导出页面为word的两种方法,文中通过代码示例和图文介绍的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下
    2024-12-12
  • 使用vue实现多规格选择实例(SKU)

    使用vue实现多规格选择实例(SKU)

    这篇文章主要介绍了使用vue实现多规格选择实例(SKU),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-08-08
  • Vue页面骨架屏的实现方法

    Vue页面骨架屏的实现方法

    在开发webapp的时候总是会受到首屏加载时间过长的影响,越来越多的APP采用了“骨架屏”的方式去提升用户体验。这篇文章主要介绍了Vue页面骨架屏的实现方法,感兴趣的小伙伴们可以参考一下
    2018-05-05
  • ant design vue中日期选择框混合时间选择器的用法说明

    ant design vue中日期选择框混合时间选择器的用法说明

    这篇文章主要介绍了ant design vue中日期选择框混合时间选择器的用法说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-10-10
  • Vue实现导航栏的显示开关控制

    Vue实现导航栏的显示开关控制

    今天小编就为大家分享一篇Vue实现导航栏的显示开关控制,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-11-11
  • Vue计算属性的使用

    Vue计算属性的使用

    本篇文章主要介绍了Vue计算属性的使用,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-08-08
  • vue Antd 输入框Input自动聚焦方式

    vue Antd 输入框Input自动聚焦方式

    这篇文章主要介绍了vue Antd 输入框Input自动聚焦方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-04-04
  • VSCode写vue项目一键生成.vue模版,修改定义其他模板的方法

    VSCode写vue项目一键生成.vue模版,修改定义其他模板的方法

    这篇文章主要介绍了VSCode写vue项目一键生成.vue模版,修改定义其他模板的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-04-04
  • Vue3响应式陷阱之对象引用丢失导致的数据更新失效的解决方法

    Vue3响应式陷阱之对象引用丢失导致的数据更新失效的解决方法

    最近在开发一个表单配置功能时,遇到了一个诡异的 Bug:明明在函数中成功赋值了,console.log 也打印出了正确的值,但页面上就是不显示,经过一番排查,发现这是一个典型的 Vue 响应式陷阱,今天分享出来,希望能帮到遇到类似问题的同学,需要的朋友可以参考下
    2025-11-11
  • vue通过接口直接下载java生成好的Excel表格案例

    vue通过接口直接下载java生成好的Excel表格案例

    这篇文章主要介绍了vue通过接口直接下载java生成好的Excel表格案例
    2020-10-10

最新评论