1、需要在项目中引用jquery,效果如下图:(商品规格是动态从后台获取的,每次勾选会去组合)

2、多选框代码结构如下:

<!--SKU--><div class="wrap" v-if="this.obj.length > 0"><div v-if="goodsId == '' || goodsId == undefined || goodsId == null"><div class="control-group choose_config"><el-form-item label="商品规格"><div class="controls"><div v-for="(item,index) in obj" :key="index"><h3 class="Father_Title">{{Object.keys(item).join()}}</h3><ul :class="'Father_Item' + ' ' + 'Father_Item'+index"><li v-for="val,index in item[Object.keys(item).join()]" :key="index"><label><inputid="Checkbox0" type="checkbox" @change="init"class="checkbox check_item" :value="val">{{val}}</label></li></ul><br></div></div></el-form-item></div><!-- 生成表格 --><div class="control-group mt10"><el-form-item><div class="controls" id="createTable"></div></el-form-item></div></div></div><!--SKU-->// 商品数据结构如下,循环渲染,每次点击多选框生成表格。

obj = [
       {12: ["22"]},
       {出行人数: ["单人", "三人行"]},
       {团期: ["01/30", "02/12", "02/15", "01/20"]}
     ]

3、动态生成表格:

// 添加商品规格列表
            init() {$('.checkbox', parent).each(function () {var bCheck2 = true;if (_this.hasClass('check_all')) {if (_this.get(0).checked) {bCheck2 = true;$('.check_item', parent).prop('checked', bCheck2);} else {bCheck2 = false;$('.check_item', parent).prop('checked', bCheck2);}return false;} else {if ((!this.checked) && (!$(this).hasClass('check_all'))) {bCheck2 = false;$('.check_all', parent).prop('checked', bCheck2);return false;}}$('.check_all', parent).prop('checked', bCheck2);});this.Creat_Table();},Creat_Table() {this.hebingFunction();var SKUObj = $('.Father_Title');var arrayTile = new Array(); // 表格标题数组var arrayInfor = new Array(); // 盛放每组选中的CheckBox值的对象var arrayColumn = new Array(); // 指定列,用来合并哪些列var bCheck = true; // 是否全选,只有全选,表格才会生成var columnIndex = 0;$.each(SKUObj, function (i, item) {arrayColumn.push(columnIndex++);arrayTile.push(SKUObj.eq(i).text().replace(':', ''));var itemName = '.Father_Item' + i;var bCheck2 = true; // 是否全选// 获取选中的checkbox的值var order = new Array();$(itemName + ' .check_item:checked').each(function () {order.push($(this).val());});arrayInfor.push(order);if (order.join() == '') {bCheck = false;}})// 开始生成表格if (bCheck) {$('#createTable').html('');var table = $('<table id="process" class="columnList"></table>');table.appendTo($('#createTable'));var thead = $('<thead></thead>');thead.appendTo(table);var trHead = $('<tr></tr>');trHead.appendTo(thead);// 创建表头var str = '';$.each(arrayTile, function (index, item) {str += '<th width="100">' + item + '</th>';})str += '<th  width="">商品价格</th><th width="">市场价格</th><th width="">库存</th><th width="">已售销量</th><th width="">库存预警值</th>';trHead.append(str);var tbody = $('<tbody></tbody>');tbody.appendTo(table);var zuheDate = this.doExchange(arrayInfor);if (zuheDate.length > 0) {//创建行$.each(zuheDate, function (index, item) {var td_array = item.split(',');var tr = $('<tr></tr>');tr.appendTo(tbody);var str = '';$.each(td_array, function (i, values) {str += '<td>' + values + '</td>';});str += '<td ><input  value="" class="inpbox txt1 inpbox-mini" type="text"></td>';str += `<td ><input  value="" class="inpbox txt2 inpbox-mini" type="text"></td>`;str += '<td ><input  value="" class="inpbox txt3 inpbox-mini" type="text"></td>';str += '<td ><input  value="0" disabled="disabled" class="inpbox txt4 inpbox-mini" type="text"></td>';str += '<td ><input  value="" class="inpbox txt5 inpbox-mini" type="text"></td>';tr.append(str);});}//结束创建Table表arrayColumn.pop(); //删除数组中最后一项//合并单元格
                    $(table).mergeCell({// 目前只有cols这么一个配置项, 用数组表示列的索引,从0开始
                        cols: arrayColumn});} else {//未全选中,清除表格document.getElementById('createTable').innerHTML = "";}},hebingFunction: function () {$.fn.mergeCell = function (options) {return this.each(function () {var cols = options.cols;for (var i = cols.length - 1; cols[i] != undefined; i--) {mergeCell($(this), cols[i]);}dispose($(this));})};function mergeCell($table, colIndex) {$table.data('col-content', ''); // 存放单元格内容$table.data('col-rowspan', 1); // 存放计算的rowspan值 默认为1$table.data('col-td', $()); // 存放发现的第一个与前一行比较结果不同td(jQuery封装过的), 默认一个"空"的jquery对象$table.data('trNum', $('tbody tr', $table).length); // 要处理表格的总行数, 用于最后一行做特殊处理时进行判断之用// 进行"扫面"处理 关键是定位col-td, 和其对应的rowspan$('tbody tr', $table).each(function (index) {// td:eq中的colIndex即列索引var $td = $('td:eq(' + colIndex + ')', this);// 获取单元格的当前内容var currentContent = $td.html();// 第一次时走次分支if ($table.data('col-content') == '') {$table.data('col-content', currentContent);$table.data('col-td', $td);} else {// 上一行与当前行内容相同if ($table.data('col-content') == currentContent) {// 上一行与当前行内容相同则col-rowspan累加, 保存新值var rowspan = $table.data('col-rowspan') + 1;$table.data('col-rowspan', rowspan);// 值得注意的是 如果用了$td.remove()就会对其他列的处理造成影响
                                $td.hide();// 最后一行的情况比较特殊一点// 比如最后2行 td中的内容是一样的, 那么到最后一行就应该把此时的col-td里保存的td设置rowspan// 最后一行不会向下判断是否有不同的内容if (++index == $table.data('trNum'))$table.data('col-td').attr('rowspan', $table.data('col-rowspan'));}// 上一行与当前行内容不同else {// col-rowspan默认为1, 如果统计出的col-rowspan没有变化, 不处理if ($table.data('col-rowspan') != 1) {$table.data('col-td').attr('rowspan', $table.data('col-rowspan'));}// 保存第一次出现不同内容的td, 和其内容, 重置col-rowspan$table.data('col-td', $td);$table.data('col-content', $td.html());$table.data('col-rowspan', 1);}}})}// 同样是个private函数 清理内存之用function dispose($table) {$table.removeData();}},doExchange: function (doubleArrays) {// 二维数组,最先两个数组组合成一个数组,与后边的数组组成新的数组,依次类推,知道二维数组变成以为数组,所有数据两两组合var len = doubleArrays.length;if (len >= 2) {var arr1 = doubleArrays[0];var arr2 = doubleArrays[1];var len1 = arr1.length;var len2 = arr2.length;var newLen = len1 * len2;var temp = new Array(newLen);var index = 0;for (var i = 0; i < len1; i++) {for (var j = 0; j < len2; j++) {temp[index++] = arr1[i] + ',' + arr2[j];}}var newArray = new Array(len - 1);newArray[0] = temp;if (len > 2) {var _count = 1;for (var i = 2; i < len; i++) {newArray[_count++] = doubleArrays[i];}}return this.doExchange(newArray);} else {this.form.array1 = doubleArrays[0] // 获得的组合数据,需要自己把后面的价格信息拼接上去this.count = this.form.array1.lengthreturn doubleArrays[0];}},di() { // 获取表格数据,并转换为JSON格式this.goodArr = []for (let i = 0; i < $('.txt1').length; i++) {this.form.array1[i] += ',' + $('.txt1').eq(i).val()this.form.array1[i] += ',' + $('.txt2').eq(i).val()this.form.array1[i] += ',' + $('.txt3').eq(i).val()this.form.array1[i] += ',' + $('.txt4').eq(i).val()this.form.array1[i] += ',' + $('.txt5').eq(i).val()}for (let k = 0; k < this.form.array1.length; k++) {let obj2 = {};let str = this.form.array1[k].split(",");let strSize = str.length;let nameSize = this.obj.length;let o = this.objif (strSize > 5) {for (let j = 0; j < nameSize; j++) {let first = Object.keys(o[j]).join()obj2[first] = str[j]}obj2.price = str[strSize - 5];obj2.marketPrice = str[strSize - 4];obj2.stock = str[strSize - 3];obj2.soldVolume = str[strSize - 2];obj2.warnStock = str[strSize - 1];}this.goodArr.push(obj2);}console.log(this.goodArr)},

转载于:https://www.cnblogs.com/liguiwang/p/8431156.html

在vue中动态添加商品SKU相关推荐

  1. Vue中 动态添加class写法 动态静态clas混合

    Vue中 动态添加class写法 动态静态clas混合 示例 //fx,cont-block为静态class ob为动态class <div :class="[ 'fx','cont- ...

  2. vue中动态添加组件

    效果: 代码: <template><div><div v-for="(item,index) in lst"><h4>{{item ...

  3. vue 动态添加click_vue,在模块中动态添加dom节点,并监听

    vue向数组中动态添加数据 vue中数据更新通过v-model实现,向数组中添加数据通过push()实现,向shortcuts数组中动态添加newShortcut对象中的title和action th ...

  4. vue改变class名字_vue中动态添加class类名的方法

    vue 动态添加class类名,灵活得让你发狂,下面示例几个 动态添加类名 文字的颜色) 文字的颜色) 三元表示式(文字的颜色) 文字的颜色) 文字的颜色) 通过方法设置class类名 export ...

  5. vue中动态引入图片为什么要是require, 你不知道的那些事

    相信用过vue的小伙伴,肯定被面试官问过这样一个问题:在vue中动态的引入图片为什么要使用require 有些小伙伴,可能会轻蔑一笑:呵,就这,因为动态添加src被当做静态资源处理了,没有进行编译,所 ...

  6. 后盾网lavarel视频项目---vue实现动态添加和删除板块

    后盾网lavarel视频项目---vue实现动态添加和删除板块 一.总结 一句话总结: 原理就是:列表时根据vue中的videos变量中的元素来遍历的,初始时videos:[{title:'',pat ...

  7. js中动态添加/插入HTML代码块,并通过JQuery动态绑定点击事件

    文章目录 前言 一.场景需求还原 二.代码示例 1.引入JQuery库 2.代码示例 一:HTML中div标签部分 二:HTML中script标签部分 三:JS文件部分 总结 前言 本篇文章中讲的是在 ...

  8. android viewpager动态加载页面,Android viewpager中动态添加view并实现伪无限循环的方法...

    本文实例讲述了Android viewpager中动态添加view并实现伪无限循环的方法.分享给大家供大家参考,具体如下: viewpager的使用,大家都熟悉,它可以实现页面之间左右滑动的切换,这里 ...

  9. Android 在布局容器中动态添加控件

    这里,通过一个小demo,就可以掌握在布局容器中动态添加控件,以动态添加Button控件为例,添加其他控件同样道理. 1.addView 添加控件到布局容器 2.removeView 在布局容器中删掉 ...

  10. ASP.NET 2.0 中动态添加 GridView 模板列

      ASP.NET 2.0 中动态添加 GridView 模板列的例子 动态添加列,关键是实现 ITemplate.InstantiateIn 方法.下面是一个添加 GridView 模板列的例子. ...

最新文章

  1. CVE-2018-8120 Windows权限提升
  2. Debug Assert Failed 怎么办?
  3. 你拍的最让你「惊喜」的照片是哪张?
  4. Javascript基础之-强制类型转换(一)
  5. how can a model method trigger binding value refreshed
  6. Java 学习总结(187)—— 轻量级开源日志框架 tinylog 简介
  7. Lua中强大的元方法__index详解
  8. vue使用video.js解决m3u8视频播放格式
  9. 灰色系统理论概论(个人总结)
  10. Yolov5+Resnet+Flask实现唇语识别系统
  11. 最大子段和问题【思路及实现】
  12. 两个特别的10分钟临时邮箱、免费
  13. 光学表面面形的计算机仿真,光学表面面形的计算机仿真
  14. oracle主键函数,oracle 主键+1 或 -1 的函数
  15. 雷达多普勒频率计算公式_详细分析:合成孔径雷达成像技术
  16. 大话spring~spring那些事
  17. 计算机语言中beta是什么意思,Tea语言迎来1.0第一个Beta版本
  18. 小丁带你走进git世界一-git简单配置
  19. 堆晶结构_堆晶岩形成条件
  20. Java 3D 开发

热门文章

  1. 高并发来袭,如何搭建微服务架构?
  2. 国内首例!云服务器侵权案件:阿里云胜诉,不承担法律责任
  3. 运维派送红包福利,参与就有!
  4. 经济下行,薅点羊毛吧!
  5. tcp 四次挥手_TCP三次握手,四次挥手,你真的懂吗?
  6. pandas (loc、iloc、ix)的区别
  7. 嵌套for in循环组合cat方式文件中包含空格问题
  8. 由swap引出的局部变量,形参和指针的小问题
  9. js学习笔记——函数定义
  10. WebService—实现接口发布和客户端调用的几种方式