首页 > 其他 > 详细

vue结合element-ui实现二级复选框checkbox

时间:2019-06-25 15:29:19      阅读:122      评论:0      收藏:0      [点我收藏+]

话不多说先上效果

技术分享图片

交互:1、点击按钮全选,所有的checkbox全部选中;点击清空,所有的checkbox框都不选;点击确定获取选中的checkbox对应的ID数组

           2、点击右上角的全选,对应的二级都选中,反之都取消选中,当二级都选中时,对应的一级选中

上代码:

<template>
  <div class="checkboxgroup">
    <el-button type="primary" @click="handleFilterClassify">点击筛选品类</el-button>
    <el-row>
      <el-col :span="24"><p></p><span>选中的id数组:</span><span>{{checkedClassify}}</span></el-col>
    </el-row><el-row>
      <el-col :span="24"><p><span>选中的name数组:</span><span>{{checkedClassifyName}}</span></p></el-col>
    </el-row>
    <!-- 当前品类弹窗 -->
    <el-dialog
      class="filterClassfiy"
      title="筛选"
      :close-on-click-modal="false"
      :visible.sync="dialogVisibleClassify"
      width="730px"
    >
      <div class="wrap">
        <div class="title">请选择要查看的品类</div>
        <div class="content">
          <template v-if="classifyData!=null && classifyData.length>0">
            <div class="item" v-for="(first,firIndex) in classifyData">
              <div class="itemHeader">
                <div v-cloak>{{first.skillLableName}}</div>
                <div class="allCheck">
                  <el-checkbox
                    v-model="first.mychecked"
                    @change="firstChanged(firIndex,first.skillLableId)"
                    :label="first.skillLableId"
                  >全选</el-checkbox>
                </div>
              </div>
              <div class="itemContent">
                <template
                  v-for="(second,index2) in first.serviceClassEntitys"
                >
                  <el-checkbox
                    v-model="second.mychecked"
                    @change="secondChanged(firIndex,second.serviceClassId)"
                    :title="second.serviceClassName"
                    :label="second.serviceClassId"
                  >{{second.serviceClassName}}</el-checkbox>
                </template>
              </div>
            </div>
          </template>
        </div>
      </div>
      <span slot="footer" class="dialog-footer">
        <button class="confirm-btn" @click="handleSelectAllClassfiy">全选</button>
        <button class="confirm-btn" @click="handleEmptyAllClassfiy">清空</button>
        <button class="confirm-btn" @click="handleClassfiySure">确定</button>
      </span>
    </el-dialog>
  </div>
</template>
<script>
export default {
  name: "Checkbox",
  props: {},
  data() {
    return {
      dialogVisibleClassify: false, //品类弹窗是否显示
      classifyData: [], //当前所有品类数组
      checkedClassify: [], //选中的品类Id数组
      checkedClassifyName: [] //选中的品类名称数组
    };
  },
  mounted() {
    //获取品类数据
    this.getClassifyData();
  },
  methods: {
    getClassifyData() {
      this.axios
        .get(
          "https://www.easy-mock.com/mock/5cda38699ef682599c4736c7/esmart/monitor/getServiceClass"
        )
        .then(res => {
              console.log(res)
          if (res.data.code == 0 && res.data.data !== null) {
            var result = res.data.data;
            for (var i = 0; i < result.length; i++) {
              result[i]["mychecked"] = false;
              for (var j = 0; j < result[i].serviceClassEntitys.length; j++) {
                result[i].serviceClassEntitys[j]["mychecked"] = false;
              }
            }
            this.classifyData = result;
          }
        })
        .catch(err => {
          console.log(err);
        });
    },

    //点击品类筛选
    handleFilterClassify() {
      this.dialogVisibleClassify = true;
    },

     //品类弹框选择所有
        handleSelectAllClassfiy: function () {
            for (var i = 0; i < this.classifyData.length; i++) {
                this.classifyData[i].mychecked = true;
                this.firstChanged(i); //调父级change事件
            }
        },

         // 一级change事件
         firstChanged: function(index) {
            if (this.classifyData[index].mychecked == false) {
                var childrenArray = this.classifyData[index].serviceClassEntitys;
                if (childrenArray) {
                    for (var i = 0, len = childrenArray.length; i < len; i++) {
                        childrenArray[i].mychecked = false;
                    }
                }
            } else if (this.classifyData[index].mychecked = true) {
                var childrenArray = this.classifyData[index].serviceClassEntitys;
                if (childrenArray) {
                    for (var i = 0, len = childrenArray.length; i < len; i++) {
                        childrenArray[i].mychecked = true;
                    }
                }
            }
        },
        //二级change事件
        secondChanged: function (firIndex) { //子级change事件    
            var childrenArray = this.classifyData[firIndex].serviceClassEntitys;
            var tickCount = 0,
                unTickCount = 0,
                len = childrenArray.length
            for (var i = 0; i < len; i++) {
                if (childrenArray[i].mychecked == true) {
                    tickCount++;
                }
                if (childrenArray[i].mychecked == false) {
                    unTickCount++;
                }
            }
            if (tickCount == len) { //子级全勾选               
                this.classifyData[firIndex].mychecked = true;
            } else if (unTickCount == len) { //子级全不勾选             
                this.classifyData[firIndex].mychecked = false;   
            } else {
                this.classifyData[firIndex].mychecked = false;     
            }
        },

         //品类弹框清空所有
         handleEmptyAllClassfiy:function(){
            for(var i=0;i<this.classifyData.length;i++){
                for(var j=0;j<this.classifyData.length;j++){
                    this.classifyData[i].mychecked=false;
                    this.firstChanged(i)
                }
            }
        },

        ////品类筛选关闭
        handleClassfiySure: function () {
            this.checkedClassify = [];
            this.checkedClassifyName = [];
            //对classifyData处理给checkedClassify和checkedClassifyName赋值
            for (var i = 0; i < this.classifyData.length; i++) {
                var serviceClassEntitys = this.classifyData[i].serviceClassEntitys;
                var len = serviceClassEntitys.length;
                for (var j = 0; j < len; j++) {
                    if (serviceClassEntitys[j].mychecked==true) {
                        this.checkedClassify.push(serviceClassEntitys[j].serviceClassId);
                        this.checkedClassifyName.push(serviceClassEntitys[j].serviceClassName)
                    }
                }
            }

            //判断勾选的品类是否为空,为空的话显示全部
            if (this.checkedClassify.length==0) {
                for (var i = 0; i < this.classifyData.length; i++) {
                    var serviceClassEntitys = this.classifyData[i].serviceClassEntitys
                    for (var j = 0; j < serviceClassEntitys.length; j++) {
                        this.checkedClassifyName.push(serviceClassEntitys[j].serviceClassName);
                    }
                }
            }
            console.log(this.checkedClassify,this.checkedClassifyName);
            this.dialogVisibleClassify = false;//关闭弹窗
        },
        

  }
};
</script>
<style scope>
/* 当前品类弹框 */
.el-dialog {
  width: 730px !important;
  height: 577px !important;
  background-color: #18202a;
  box-shadow: 0px 2px 12px 0px rgba(0, 0, 0, 0.06);
}
.filterClassfiy .el-dialog__body {
  padding: 20px 30px;
}
.el-dialog .el-dialog__title{
    color: #fff;
}

.filterClassfiy .wrap .title {
  font-size: 16px;
  color: #acacac;
  margin: 5px;
}

.filterClassfiy .wrap .content {
  width: 630px;
  height: 355px;
  padding: 20px;
  overflow-y: auto;
  color: #fff;
  background-color: rgba(0, 0, 0, 0.2);
}

.filterClassfiy .wrap .content::-webkit-scrollbar {
  display: none;
}

.filterClassfiy .itemContent .el-checkbox {
  color: #fff;
  font-size: 12px;
  margin: 5px;
  width: 31%;
  white-space: nowrap;
  text-overflow: ellipsis;
  overflow: hidden;
}

.filterClassfiy .wrap .content .el-checkbox__label {
  padding-left: 6px;
}

.filterClassfiy .wrap .content .itemHeader {
  font-size: 14px;
  display: flex;
  justify-content: space-between;
  align-items: center;
  margin: 5px;
}
.filterClassfiy .wrap .content .itemHeader .el-checkbox {
  width: 25%;
  color: #fff;
}

.filterClassfiy .wrap .content .itemHeader .el-checkbox__inner {
  left: 54px;
}

.filterClassfiy .wrap .content .itemHeader .allCheck {
  font-size: 12px;
  display: flex;
  width: 70px;
  align-items: center;
}

.filterClassfiy .wrap .content .itemHeader .allCheck span {
  display: inline-block;
}

.filterClassfiy .wrap .content .itemContent {
  background-color: #232b34;
  padding: 10px 20px 0;
}

.confirm-btn{
    width: 100px;
    height: 29px;
    color: #fff;
    background: rgba(0, 131, 247, 0.5);
    font-size: 14px;
    outline: none;
    border: 0;
    cursor: pointer
}
.el-dialog__footer{
    text-align: center
}
</style>

  

vue结合element-ui实现二级复选框checkbox

原文:https://www.cnblogs.com/samsara-yx/p/11083038.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!