vue+element表单动态生成多级栏目的checkbox全选与部分选择

1.代码

<template>
  <div class="home">
    <el-form class="box" :model="baseForm" ref="baseForm" label-width="70px" >
      <el-card shadow="never" >
        <el-form-item label="栏目">
          <el-checkbox-group v-model="baseForm.relatedColumns">
            <template v-for="(item, index) in relatedColumns" >
              <el-row>
                <el-col :span="2">
                  <el-checkbox :key="index" :label="item.id" :indeterminate="item.indeterminate" :checked="item.mychecked" @change="onChangeTop(index, $event)">{{item.name}}</el-checkbox>
                </el-col>
                <el-col :span="12">
                  <template>
                    <el-checkbox v-if="item.child!=[]" v-for="(items, indexs) in item.child" :label="items.id" :checked="items.mychecked" :key="indexs" @change="onChangeSon(index, items.id, $event)">{{items.name}}</el-checkbox>
                  </template>
                </el-col>
              </el-row>
            </template>
          </el-checkbox-group>
        </el-form-item>
      </el-card>
    </el-form>

  </div>
</template>

<script>

export default {
    name: 'Home',
    components: {
      HelloWorld
    },
    data(){
      return{
          // 基础表单
          baseForm: {
              relatedColumns:[] //用来接收选中的id值
          },
          relatedColumns:[],  //初始化存放所有栏目
      }
    },
    mounted(){
        this.getRelationChannel()
    },
    //获取关联栏目列表
    methods:{
        //获取数据 添加自定义属性 mychecked及indeterminate
        getRelationChannel(){
            this.$axios.get('./check.json').then(res=>{
                res.data.data.forEach(item=>{
                    console.log(item);
                    item.mychecked = false
                    item.indeterminate =false
                    if(item.child!=[]){
                        item.child.forEach(items=>{
                            items.mychecked = false
                            items.indeterminate =false
                        })
                    }
                })
                this.relatedColumns = res.data.data
            }).catch(error=>{
                console.log(error);
            })
        },
        //父级checbox点击事件
        onChangeTop(index, e){
            //选中
            if(e){
                this.relatedColumns[index].mychecked  = true
                this.relatedColumns[index].indeterminate = false
                this.relatedColumns[index].child.forEach(item=>{
                    let i = this.baseForm.relatedColumns.indexOf(item.id)
                    if(i === -1){
                        this.baseForm.relatedColumns.push(item.id)
                    }
                })
            }
            //未选中
            else{
                this.relatedColumns[index].mychecked  = false
                this.relatedColumns[index].indeterminate = false
                this.relatedColumns[index].child.forEach(item=>{
                    let i = this.baseForm.relatedColumns.indexOf(item.id)
                    if(i>-1){
                        this.baseForm.relatedColumns.splice(i,1)
                    }
                })
            }
            // console.log(this.baseForm.relatedColumns);
        },
        //子级checbox点击事件
        onChangeSon(index , sonId, e){
            var childrenArray = this.relatedColumns[index].child
            var tickCount = 0, len = childrenArray.length
            childrenArray.forEach(item=>{
                if(this.baseForm.relatedColumns.indexOf(item.id)>-1){
                    item.mychecked = true
                }
            })

            for(let i = 0; i < len; i++){
                if(sonId == childrenArray[i].id) {
                    childrenArray[i].mychecked = e
                }
                if(childrenArray[i].mychecked == true) {
                    tickCount++
                }
            }

            this.relatedColumns[index].indeterminate = ((tickCount!==len)&&(tickCount!==0)) ? true:false
            this.relatedColumns[index].mychecked = (tickCount===0) ? false:true  //全不选的时候为false

            if(tickCount === 0){
                let i = this.baseForm.relatedColumns.indexOf(this.relatedColumns[index].id)
                if(i>-1){
                    this.baseForm.relatedColumns.splice(i,1)
                }
            }
            else{
                if(this.baseForm.relatedColumns.indexOf(this.relatedColumns[index].id)===-1){
                    this.baseForm.relatedColumns.push(this.relatedColumns[index].id)
                }
            }
            // console.log(this.baseForm.relatedColumns);
            // console.log(this.relatedColumns);
        },
    }


}
</script>

<style scoped>
  .home{
    margin-top: 200px;
  }
  .box{
    width: 50%;
    margin: auto;
  }
  .el-col-12{
    display: flex;
    justify-content: flex-start;
    padding-left: 40px;
  }
</style>

2.效果

在这里插入图片描述

3.实例地址

https://qingchen1120.com/check

4.个人理解

<el-checkbox :key=“index” :label=“item.id” :indeterminate=“item.indeterminate” :checked=“item.mychecked” @change=“onChangeTop(index, $event)”>{{item.name}}

:indeterminate:设置 indeterminate 状态,只是控制样式的选中、不选中、部分选中
:checked:当前是否勾选
:label:选中状态的值(只有在checkbox-group或者绑定对象类型为array时有效)

5.原文地址

原文地址

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值