element-UI根据后台数据动态生成el-checkbox-group,点击保存获取绑定的checked项(二维数组)

Posted tanweiwei

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了element-UI根据后台数据动态生成el-checkbox-group,点击保存获取绑定的checked项(二维数组)相关的知识,希望对你有一定的参考价值。

我的效果图如下:

技术图片

 

  1 <template>
  2   <div class="mcontainer">
  3     <el-form :model="formApp" ref="formApp" :rules="rules">
  4       <el-form-item label="APP选择" :label-width="formLabelWidth" prop="appCode">
  5         <el-select style="width:100%;"
  6           v-model="formApp.appCode"
  7           multiple
  8           :disabled="type == ‘add‘?false : true"
  9           placeholder="请选择"
 10           @change="changeType">
 11           <el-option
 12             v-for="item in selList"
 13             :key="item.code"
 14             :label="item.name"
 15             :value="item.code">
 16           </el-option>
 17         </el-select>
 18       </el-form-item>
 19       <el-form-item label="所属分类" :label-width="formLabelWidth">
 20         <div v-show="typeList.length > 0" class="check-box" v-for="(item, index) in typeList">
 21           <span class="app-name">
 22             <el-tag>{{ item.appName }}</el-tag>
 23           </span>
 24           <el-checkbox-group v-model="checkedEquipments[index]">
 25             <el-checkbox
 26               @change="handleChange(type,index,item)"
 27               v-for="(type, i) in item.types"
 28               :disabled="i == 0? true : false"
 29               :key="type.id"
 30               :label="type.id">{{type.name}}</el-checkbox>
 31           </el-checkbox-group>
 32         </div>
 33         <div v-show="typeList.length == 0" class="no-typelist">请先选择APP</div>
 34       </el-form-item>
 35     </el-form>
 36   </div>
 37 </template>
 38 
 39 <script>
 40 import debounce from ‘lodash.debounce‘;
 41 import store from ‘@/store‘;
 42 import { collectService } from ‘@/services‘;
 43 import { applicationFormatter, currencyFormatter, permissionDownFile, mesNotes  } from ‘@/common/formatter‘;
 44 import { CollectRecord } from ‘@/components/business‘;
 45 import { COLLECT_RESULT } from ‘@/common/constant‘;
 46 
 47 export default {
 48   name: ‘CollectOrder‘,
 49   components: { CollectRecord },
 50   data() {
 51     return {
 52       formLabelWidth: ‘80px‘,
 53       /*随意修改后的checked项,
 54       * 因为是二维数组,我的第一个类「全部」默认的ID是0,如果没有全部,不需要0,直接这样子就可以[[],[],[],[],[]]
 55       * 我默认显示了5个,具体几个会根据app的选择值来重新计算,如果一个APP,就一级,2个APP,就2组,
 56       * ******************************** */
 57       checkedEquipments: [[0],[0],[0],[0],[0]], 
 58       checkEquipArr: [],   // 传给后台的二维数组,根据自己要返回给后台的格式重组过的
 59       formApp: {
 60         appCode: [],
 61         appTypeIds: [],//马甲及分类列表
 62       },
 63       type: ‘add‘,
 64       allType: [], //获取的所有类别
 65       typeList: [],
 66     }
 67       //我得到的类别数据是一个二维数据,如下
 68       // [
 69       //   {
 70       //     appCode: "MoneyHome", 
 71       //     appName: "MoneyHome", 
 72       //     types: [
 73       //       {id: 21, name: "第二个app--分类一"}
 74       //     ]
 75       //   },
 76       //   {
 77       //     appCode: "RupeeHome",
 78       //     appName: "RupeeHome",
 79       //     types: [
 80       //       {id: 20, name: "aaa"}, 
 81       //       {id: 22, name: "q"}
 82       //     ]
 83       //   }
 84       // ]
 85   },
 86   methods: {
 87     //APPP选择的时候,类别也做相应的改变
 88     changeType(val) {
 89       //类别的数组占位,app选择几个,就会有几组类别
 90       this.checkedEquipments = [];//因为默认的有5组,所以要重新清掉了,根据选择几组来确定
 91       val.forEach((item,index) => {
 92         if(index <= val.length) {
 93           this.checkedEquipments.push([0]);
 94         }
 95       });
 96       console.log(‘this.checkedEquipments---‘, this.checkedEquipments);
 97       this.typeList = [];
 98       //this.allType是我能过接口返回的所有的类,存在这里了,换成自己相应的变量就好
 99       let list = Object.assign([],this.allType);
100       //这一步是为了给每一类组数加一个"全部",如果没有这个需求,就不需这步了
101       let obj = {
102         id: 0,
103         name: ‘全部‘,
104       };
105       list.forEach(item => {
106         //每个类别要加上全部
107         if(item.types.length > 0){
108           if(item.types[0].name != ‘全部‘){
109             item.types.unshift(obj);
110           }
111         }else {
112           item.types.unshift(obj);
113         }
114         val.forEach(name => {
115           if(item.appCode == name){
116             this.typeList.push(item);
117           }
118         });
119       });
120     },
121     //创建保存时的二维数组
122     handleChange (data, index, item) {
123       this.checkEquipArr = [];
124       let arr = this.checkedEquipments;
125       for (let i = 0; i < arr.length; i ++) {
126         let equipment = arr[i];
127         if (equipment.length > 0) {
128           let obj = {
129             appCode: this.typeList[i].appCode,
130             typeIds: []
131           }
132           for (let j = 0; j < equipment.length; j++) {
133             obj.typeIds.push(equipment[j])
134           }
135           this.checkEquipArr.push(obj);
136         }
137       }
138       console.log("QERQWER00000====",this.checkEquipArr);
139       //重组后我传给后台的二维数组,可以适当根据自己的需求调整格式和字段
140       // [
141       //   {
142       //     appCode: "MoneyHome",
143       //     typeIds: [0, 21],
144       //   },
145       //   {
146       //     appCode: "RupeeHome",
147       //     typeIds: [0, 20, 22]
148       //   }
149       // ]
150     },
151   },
152 };
153 </script>

参考了这篇文章:https://www.cnblogs.com/wjunwei/p/9531322.html

然后根据自己的实际需求作了一些改动。

以上是关于element-UI根据后台数据动态生成el-checkbox-group,点击保存获取绑定的checked项(二维数组)的主要内容,如果未能解决你的问题,请参考以下文章

element-ui 动态表头渲染表格

vue element-ui动态生成table表头和数据

zTreezTree根据后台数据生成树并动态设置前面的节点复选框的选中状态

编辑表格输入内容根据input输入框输入数字动态生成表格行数编辑表格内容提交传给后台数据处理

element-ui表格组件table实现列的动态显示与隐藏

vue中通过后台返回的只动态生成表单及提交