1、实现效果图如下:

在这里插入图片描述

2、代码实现如下(采用vue+antd):

template:

<template>
  <!--多个区全选弹窗-->
  <div class='sale_allot'>
    <a-modal
      :maskClosable='false'
      class='sale_allot'
      title="多个全选弹窗"
      v-model="visible1"
      :bodyStyle="{width:'100%'}"
      height='500px'
    >
      <div style="min-height:300px;">
        <div class='item_check' v-for='(item,index) in totalRolesList' :key='index'>
          <div>
            <div :style="{ borderBottom: '1px solid #E9E9E9',marginTop:'15px'}">
              <a-checkbox :indeterminate="item.indeterminate" :checked="item.checkAll" @change="onCheckAllChange($event,index)">
                {{ item.orgName }}
              </a-checkbox>
            </div>
            <br />
            <a-checkbox-group  v-model="item.checkedList"  :options="item.userList" @change="onChange($event,index)" >
             <span slot='label' slot-scope='{value}'>
                 {{value}}
             </span>
            </a-checkbox-group>
          </div>
        </div>
      </div>
      <template slot="footer">
        <a-button key="back" @click="noOk">
          暂不选择
        </a-button>
        <a-button key="submit" type="primary" :loading="loading" @click="onOk">
          确定选择
        </a-button>
      </template>
    </a-modal>
  </div>
</template>

script部分:

<script>
//多选框的数据
const listData = [
  {
    orgName: "火影村",
    checkAll:false,
    indeterminate : false,
    checkedList : [],
    userList: [
      {
        label: "鸣人",
        value:1
      },
      {
        label: "佐助",
        value: 2
      },
      {
        label: "自来也",
        value: 3
      },
      {
        label: "卡卡西",
        value: 4
      },
      {
        label: "小樱",
        value: 5
      }
    ]
  },
  {
    orgName: "晓组织",
    checkAll:false,
    indeterminate : false,
    checkedList : [],
    userList: [
      {
        label: "佩恩",
        value:1
      },
      {
        label: "角度",
        value: 2
      },
      {
        label: "长门",
        value: 3
      },
      {
        label: "蝎",
        value: 4
      },
      {
        label: "再不斩",
        value: 5
      }
    ]
  }
]
export default {
  props:{
    selectedRowKeys:{
      type:Array,  //类型
      require:false,  //必传
      default:()=> []
    }
  },
  data() {
    return {
      visible1:false,
      totalRolesList:listData,//所有组员角色数据
      loading:false,//确定分配的按钮的响应状态
    }
  },
  methods: {
    onChange(e,index) {//单个选择
      this.totalRolesList[index].indeterminate = !!this.totalRolesList[index].checkedList.length && this.totalRolesList[index].checkedList.length < this.totalRolesList[index].userList.length;
      this.totalRolesList[index].checkAll = this.totalRolesList[index].checkedList.length === this.totalRolesList[index].userList.length;
    },
    onCheckAllChange(e,index) {//选择全部的事件
      //如果选中全选的话就遍历拿出当前相对项的数组的全部值
      let newArr = []
      if(e.target.checked){
        newArr = this.totalRolesList[index].userList.map(item=>{
          return item.value
        })
      }
      this.totalRolesList[index].checkedList = e.target.checked ? newArr:[]
      this.totalRolesList[index].indeterminate = false
      this.totalRolesList[index].checkAll = e.target.checked
    },
    //确定选择
    onOk(){
      //将所有选中的人员的id拿出来拼接到一个数组里面
      let userIds = []
      let sendData = {}
      this.totalRolesList.forEach(item=>{
        userIds = [...userIds,...item.checkedList]
      })
    },
    //暂不选择
    noOk(){
      this.loading=false
      this.visible1 = false
    }
  }
}
</script>

style部分:

<style lang='less'>
.sale_allot.ant-modal{
  width: 700px!important;
}
.sale_allot .ant-modal-body{
  width: 100%;
  overflow: auto;
  max-height: 550px;
}
</style>
Logo

前往低代码交流专区

更多推荐