vue中循环多组checkbox-group

1.效果展示

实现多组数据分组展示并实现勾选功能,使用的是element-ui的checkbox-group组件实现的。

项目中实现效果:

这个组件使用起来真的要注意踩坑,仔细阅读理解官网给的这段介绍,后面写代码都会涉及到。

2.代码实现

 html代码

           <ul class="menu-sub">
                  <li v-for="(item,index) in infoArray"
                      :key="index">
                    <el-checkbox
                        @change="(val) => handleCheckAll(val, item)"  //全选按钮触发方法
                        :indeterminate="itemIndeterminate(item)"  //是否全选
                        v-model="item.flag"      //v-model绑定,布尔值决定勾选状态
                        >{{ item.poolName }}</el-checkbox
                      >
                      <el-checkbox-group                //group中选中数据为数据,且对应 
                                                            label值,显示勾选状态
                        v-model="selectedData"
                        @change="handleChanges(item)"
                        style="padding-left: 30px;"
                      >
                        <el-checkbox
                          style="width: 230px;"
                          v-for="items in item.infoList"
                          :key="items.infoId"
                          :label="items.infoId"  //注意label的绑定值,即取值
                          >{{ items.infoName }}</el-checkbox
                        >
                      </el-checkbox-group>
                 </li>
           </ul>

js代码

      selectedList:[],  //选中数据(数组)
      infoArray:[       //后端返回数据格式(多级)
        // {
        //   poolName:1,
        //   infoList:[{
        //     infoId:14324,
        //     infoName:ces
        //   }]
        // }
      ],
init(){
      listAllCard().then(res=>{
        this.cardList=res.data
      })
      listAllInfo().then(res=>{
        // 添加是否全选标识
        this.infoArray=(res.data).map((v)=>({
          ...v,flag:false
        }))
      })
    },
    // 全选
    handleCheckAll(val,item){
       // 过滤掉没有选中的数据,item.child中不包含v时返回-1
      const next=item.infoList.map(item=>item.infoId)
      const filterArr = this.selectedData.filter(
        (v) => next.indexOf(v) == -1
      );
      this.selectedData= val ? filterArr.concat(next) : filterArr;
    },
     itemIndeterminate(item) {
      const infoLists=item.infoList.map(ite=>ite.infoId)
      return (
        infoLists.some((v) => this.selectedData.indexOf(v) > -1) &&
        !infoLists.every((v) => this.selectedData.indexOf(v) > -1)
      );
    },
    // 勾选变化方法
    handleChanges(val){
      const infoLists=val.infoList.map(ite=>ite.infoId)
      infoLists.every((v) => {
          if (this.selectedData.indexOf(v)>-1) {
            val.flag = true;
          }else{
            val.flag=false
          }
        });
    },
    handleAdd(row){
      this.reset();
      this.form.cardId=row.cardId
      this.form.templateId=row.templateId
      this.postData.templateId=row.templateId
      this.cardList.forEach(element => {
        if(element.cardId==row.cardId){
          this.cardName=element.cardName
        }
      });
      this.templateName=row.templateName

      // 回显
      this.selectedData=[]
      getList(row.templateId).then(res=>{
        res.data.forEach(element => {
          this.selectedData.push(element.infoId)

          // 判断是否全选(放在this.selectedData数据获取完成后,异步请求下数据如果还未存入会导致读取不到,一开始了放在外层,导致回显失败)
          this.infoArray.forEach((item,index)=>{
            this.tempList[index]=item.infoList.map(ite=>ite.infoId)
            this.tempList[index].some((v) => {
                if (this.selectedData.indexOf(v)==-1) {
                  item.flag = false;
                }else{
                  item.flag=true
                }
            });
          })
        });
      })
      this.open = true;
      this.title = "设置卡申请模版申请信息";
    },

3.总结

1.因为官网给出的checkbox group绑定的数据格式是数组,而在项目中接收的数据通常是对象数组,我这里label绑定的是数组中对象的id属性,点击获取的是id的数组,在最后提交数据时需要做处理。

2.一开始也尝试了label绑定整个对象,这样获取到的直接便是最终需要的对象数组,展示和添加是可以实现的,但是回显遇到了问题,在网上看是回显的数据格式要与选中的数组中对象的格式一致,尝试了没有效果,后面再研究一下。

3.在网上看到了一种方法,使用JSON.stringify()使label绑定对象转换的字符串,还没有尝试是否可行,先记录一下。

<el-checkbox-group v-model="form.userClaims">
  <el-form-item v-for="item in items" :key="item.id">
    <el-checkbox
      :label="JSON.stringify({ id: item.id, type: item.name })"
      >{{ item.name }}</el-checkbox
    >
  </el-form-item>
</el-checkbox-group>

  • 7
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
可以按照以下步骤使用 `el-checkbox-group` 实现多选: 1. 在 Vue 组件引入 `el-checkbox-group` 和 `el-checkbox` 组件: ```html <template> <el-checkbox-group v-model="checkedFruits"> <el-checkbox label="apple">Apple</el-checkbox> <el-checkbox label="banana">Banana</el-checkbox> <el-checkbox label="orange">Orange</el-checkbox> </el-checkbox-group> </template> <script> import { ElCheckboxGroup, ElCheckbox } from 'element-ui'; export default { components: { ElCheckboxGroup, ElCheckbox, }, data() { return { checkedFruits: [], }; }, }; </script> ``` 2. 定义一个数组 `checkedFruits` 用于存储选的水果的值。 3. 在 `el-checkbox-group` 使用 `v-model` 绑定 `checkedFruits` 数组,这样选的水果值就会被存储在 `checkedFruits` 。 4. 在 `el-checkbox` 组件使用 `label` 属性指定水果的值。 5. 如果需要在表单提交选的水果值,可以将 `checkedFruits` 数组绑定到表单的 `v-model` 上,这样选的水果值就会被提交给后端。例如: ```html <template> <form @submit.prevent="submitForm"> <el-checkbox-group v-model="checkedFruits"> <el-checkbox label="apple">Apple</el-checkbox> <el-checkbox label="banana">Banana</el-checkbox> <el-checkbox label="orange">Orange</el-checkbox> </el-checkbox-group> <button type="submit">Submit</button> </form> </template> <script> import { ElCheckboxGroup, ElCheckbox } from 'element-ui'; export default { components: { ElCheckboxGroup, ElCheckbox, }, data() { return { checkedFruits: [], }; }, methods: { submitForm() { // 提交表单时将选的水果值发送到后端 console.log(this.checkedFruits); }, }, }; </script> ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值