利用ElementUI配置商品的规格参数

需求:商品可以设置多个规格,需要自动生成对应规格的所有组合,并设置该规格商品的图片、价格、库存等数据。

在这里插入图片描述

<template><div class="sku-list"><template v-if="!disabled"><div class="sku-list-head"><el-button type="primary" size="mini" @click="addSkuRow">添加规格</el-button></div><divclass="sku-list-item"v-for="(item, index) in skuData.attrList":key="index"><div class="sku-list-item-main"><div class="sku-list-item__layout"><span class="span">规格名</span><el-inputsize="small"v-model="item.attrName"class="input"></el-input></div><div class="sku-list-item__layout"><span class="span">规格值</span><div class="sku-list-item-tags"><el-tagclass="sku-list-item-tag"closable@close="removeSkuAttr(index, i)"v-for="(subitem, i) in item.attrValue":key="i">{{ subitem.attrValue }}</el-tag><el-buttonsize="small"icon="el-icon-plus"@click="addSkuAttr(index)">添加</el-button></div></div></div><el-buttontype="text"size="small"class="sku-list-item-removeBtn"@click="removeSkuRow(index)">删除规格</el-button></div></template><el-table border :data="skuData.skuList"><el-table-column label="规格图片" align="center" width="120"></el-table-column><el-table-columnlabel="规格名称"align="center"prop="attrPath"></el-table-column><el-table-column label="规格售价" align="center"><template slot-scope="scope"><el-input-number v-model="scope.row.priceCost" :precision="2" :min="0.01"/></template></el-table-column>
<!--      <el-table-column label="销售价格" align="center">-->
<!--        <template slot-scope="scope">-->
<!--          <el-input-->
<!--            :readonly="disabled"-->
<!--            v-model="scope.row.priceCash"-->
<!--          ></el-input>-->
<!--        </template>-->
<!--      </el-table-column>-->
<!--      <el-table-column label="划线价格" align="center">-->
<!--        <template slot-scope="scope">-->
<!--          <el-input-->
<!--            :readonly="disabled"-->
<!--            v-model="scope.row.priceOriginal"-->
<!--          ></el-input>-->
<!--        </template>-->
<!--      </el-table-column>--><el-table-column label="规格库存" align="center"><template slot-scope="scope"><el-input-number v-model="scope.row.stock" :min="0" :max="999999"/></template></el-table-column><!-- <el-table-column label="商品预警值" align="center"><template slot-scope="scope"><el-input :readonly="disabled" v-model="scope.row.stock"></el-input></template></el-table-column> --><!-- <el-table-column v-if="!disabled" label="操作" align="center"><template><el-button type="text" size="small">删除</el-button><el-button type="text" size="small">上移</el-button></template></el-table-column> --></el-table></div>
</template><script>
export default {model: {prop: "skuData",event: "changeSku",},props: {// skuData: {//   type: Object,//   default: () => ({}),// },disabled: {type: Boolean,default: false,},},data() {return {skuData: {attrList: [],skuList: [],initSkuList: []}};},watch: {"skuData.attrList": {handler() {if (!this.disabled) {this.$set(this.skuData, "skuList", this.getTable());}},deep: true,immediate: true,},},methods: {// 添加规格行addSkuRow(i) {// const attrList = this.skuData.attrList;// if (attrList === undefined) {//   const list = [{//     attrName: "",//     attrValue: []//   }]//   this.skuData.attrList = list;// } else {//   attrList.push({//     attrName: "",//     attrValue: []//   });// }this.skuData.attrList.push({attrName: "",attrValue: []})this.$emit("changeSku", this.skuData);},// 删除规格行removeSkuRow(i) {this.skuData.attrList.splice(i, 1);this.$emit("changeSku", this.skuData);},// 删除规格属性值removeSkuAttr(a, b) {this.skuData.attrList[a].attrValue.splice(b, 1);this.$emit("changeSku", this.skuData);},// 添加规格属性值addSkuAttr(i) {this.$prompt("请输入规格值", "添加规格值", {confirmButtonText: "确定",cancelButtonText: "取消",inputPattern: /\S+/,inputErrorMessage: "规格值不能为空",closeOnClickModal: false,}).then(({ value }) => {this.skuData.attrList[i].attrValue.push({attrValue: value,});this.$emit("changeSku", this.skuData);});},onUploadImgSuccess(res, file, row) {if (!file) {return;}row.icon = file;this.$emit("changeSku", this.skuData);},getTable() {const table = [];const attrValueAry = [];const arr = [];const tmpSkuData = (this.skuData.attrList || []).filter((d) => d.attrName !== "" && d.attrValue.length > 0);if (!tmpSkuData || tmpSkuData.length === 0) {return [];}tmpSkuData.forEach((item) => {attrValueAry.push(item.attrValue);});function func(skuArr = [], i) {for (let j = 0; j < attrValueAry[i].length; j++) {if (i < attrValueAry.length - 1) {skuArr[i] = attrValueAry[i][j];func(skuArr, i + 1);} else {arr.push([...skuArr, attrValueAry[i][j]]);}}}func([], 0);arr.forEach((item) => {let attrPath = "";// const findItem = {};// const tableItem = {};item.forEach((d, idx) => {attrPath += `${tmpSkuData[idx].attrName}:${d.attrValue};`;});attrPath = attrPath.slice(0, attrPath.length - 1);const findItem =this.skuData.initSkuList.find((item) => {return attrPath.includes(item.attrPath);}) || {};const tableItem = Object.assign({priceCost: 0,priceCash: 0,priceOriginal: 0,stock: 0,icon: null,},findItem,{attrPath,});table.push(tableItem);});return table;},},
};
</script><style lang="scss" scoped>
.sku-list {&-head {margin-bottom: 10px;}&-item {display: flex;align-items: center;border: 1px solid #eee;border-radius: 5px;margin-bottom: 20px;padding: 20px 50px;&-main {flex: 1;}&-removeBtn {margin-left: 20px;color: #f56c6c;}&__layout {display: flex;align-items: center;margin-bottom: 20px;&:last-child {margin-bottom: 0;}.input {width: 240px;}.span {font-size: 13px;font-weight: bold;margin-right: 10px;}}&-tags {flex: 1;}&-tag {margin-bottom: 10px;margin-right: 10px;}}
}
</style>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/210749.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Leetcode每日一题学习训练——Python3版(到达首都的最少油耗)

版本说明 当前版本号[20231205]。 版本修改说明20231205初版 目录 文章目录 版本说明目录到达首都的最少油耗理解题目代码思路参考代码 原题可以点击此 2477. 到达首都的最少油耗 前去练习。 到达首都的最少油耗 ​ 给你一棵 n 个节点的树&#xff08;一个无向、连通、无环…

使用C语言创建高性能爬虫ip网络

之前写的python和GO语言的爬虫ip池的文章引起很大反响&#xff0c;这次我将以C语言来创建爬虫IP池&#xff0c;但是因为其复杂性&#xff0c;可能代码并非完美。但是最终也达到的想要的效果。 因为在C语言中创建代理IP池可能会比较复杂&#xff0c;且C语言并没有像Python那样的…

HarmonyOS应用开发者基础认证考试(98分答案)

基于最近大家都在考这个应用开发者基础认证考试&#xff0c;因此出了一期&#xff0c;一样复制word里面搜索做&#xff0c;很快&#xff0c;当然good luck 判断题 Ability是系统调度应用的最小单元,是能够完成一个独立功能的组件。一个应用可以包含一个或多个Ability。 正确(Tr…

批量创建/更新外协工序采购信息记录

批量创建/更新没有物料号的外协工序采购信息记录。 执行事务代码ZME1X_OP,下载模板。(此程序可同时用于外协工序的创建和修改)创建外协工序的时候如果是新建则不需要输入采购信息记录号,如果是要更新外协工序价格,则必须输入采购信息记录号。价格单位默认为‘1’,货币代码…

SpringBoot面试题:(一)SpringBoot自动装配原理源码解析

源码研究 SpringBoot启动类&#xff1a;SpringBootApplication注解 import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;SpringBootApplication public class SpringBoot1Application {public static …

【开源】基于JAVA的医院门诊预约挂号系统

项目编号&#xff1a; S 033 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S033&#xff0c;文末获取源码。} 项目编号&#xff1a;S033&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 功能性需求2.1.1 数据中心模块2.1.2…

使用C语言创建高性能网络爬虫IP池

目录 一、引言 二、IP池的设计 1、需求分析 2、架构设计 3、关键技术 三、IP池的实现 1、存储实现 2、调度实现 3、通信实现 4、异常处理实现 四、代码示例 五、性能优化 六、测试与分析 七、结论 一、引言 随着互联网的快速发展&#xff0c;网络爬虫成为了获取…

【深度学习笔记】09 权重衰减

09 权重衰减 范数和权重衰减利用高维线性回归实现权重衰减初始化模型参数定义 L 2 L_2 L2​范数惩罚定义训练代码实现忽略正则化直接训练使用权重衰减 权重衰减的简洁实现 范数和权重衰减 在训练参数化机器学习模型时&#xff0c;权重衰减&#xff08;decay weight&#xff09…

【人体解剖学与组织胚胎学】练习一高度相联知识点整理及对应习题

文章目录 [toc]骨性鼻旁窦填空题问答题 关节填空题简答题 胸廓填空题简答题![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/827e7d1db3af42858d8734bb81911fea.jpeg)补充 骨性鼻旁窦 填空题 问答题 关节 填空题 简答题 胸廓 填空题 简答题 补充 第二肋对应胸骨…

混音编曲软件tudio One 6.5.1 保姆级安装教程

根据软件大数据显示De-Esser驯服人声嘶嘶声和其他高频声音&#xff0c;和其他 Studio One 中新的去实体插件一样高效且直观易用&#xff0c;使用“收听”按钮查找有问题的频率&#xff0c;然后使用相关的旋钮和 S-Mon 功能拨入 S-Reduce 量即可。实际上我们可以这样讲工作流和协…

Linux进程间通信之共享内存

&#x1f4df;作者主页&#xff1a;慢热的陕西人 &#x1f334;专栏链接&#xff1a;Linux &#x1f4e3;欢迎各位大佬&#x1f44d;点赞&#x1f525;关注&#x1f693;收藏&#xff0c;&#x1f349;留言 本博客主要内容讲解共享内存原理和相关接口的介绍&#xff0c;以及一个…

SpringBoot+SSM项目实战 苍穹外卖(3)

继续上一节的内容&#xff0c;本节完成菜品管理功能&#xff0c;包括公共字段自动填充、新增菜品、菜品分页查询、删除菜品、修改菜品。 目录 公共字段自动填充新增菜品文件上传实现新增菜品实现 useGeneratedKeys 菜品分页查询删除菜品修改菜品根据id查询菜品实现修改菜品实现…

Redis中的缓存穿透、雪崩、击穿(详细)

目录 一、概念 1. 缓存穿透&#xff08;Cache Penetration&#xff09; 解决方案&#xff1a; 2. 缓存雪崩&#xff08;Cache Avalanche&#xff09; 解决方案&#xff1a; 3. 缓存击穿&#xff08;Cache Breakdown&#xff09; 解决方案&#xff1a; 二、三者出现的根本原…

为XiunoBBS4.0开启redis缓存且支持密码验证

修改模块文件1 xiunoPHP/cache_redis.class.php: <?phpclass cache_redis {public $conf array();public $link NULL;public $cachepre ;public $errno 0;public $errstr ;public function __construct($conf array()) {if(!extension_loaded(Redis)) {return $thi…

有趣的代码——有故事背景的程序设计3

这篇文章再和大家分享一些有“背景”的程序设计&#xff0c;希望能够让大家学到知识的同时&#xff0c;对编程学习更感兴趣&#xff0c;更能在这条路上坚定地走下去。 目录 1.幻方问题 2.用函数打印九九乘法表 3.鸡兔同笼问题 4.字数统计 5.简单选择排序 1.幻方问题 幻方又…

Mac苹果视频剪辑:Final Cut Pro Mac

Final Cut Pro是一款由Apple公司开发的专业视频非线性编辑软件&#xff0c;是业界著名的视频剪辑软件之一。它最初发布于1999年&#xff0c;是Mac电脑上的一款独占软件。Final Cut Pro具有先进的剪辑工具、丰富的特效和颜色分级、音频处理等功能&#xff0c;使得用户可以轻松地…

Linux之重谈文件和c语言文件接口

重谈文件 文件 内容 属性, 所有对文件的操作都是: a.对内容操作 b.对属性操作 关于文件 一&#xff1a; 即使文件的内容为空&#xff0c;该文件也会在磁盘上也会占空间&#xff0c;因为文件不仅仅只有内容还有文件对应的属性&#xff0c;文件的内容会占用空间, 文件的属性也…

【面试】Java最新面试题资深开发-JVM第一弹

问题一&#xff1a;Java中的垃圾回收机制 在Java中&#xff0c;垃圾回收是如何工作的&#xff0c;可以简要描述一下垃圾回收的算法有哪些吗&#xff1f; 在Java中&#xff0c;垃圾回收是一种自动管理内存的机制&#xff0c;它负责识别不再被程序引用的对象并释放其占用的内存…

HarmonyOS与AbilitySlice路由配置

上一章我有教到鸿蒙应用开发——Ability鸿蒙应用开发的基础知识&#xff0c;那么今天我们来讲一下AbilitySlice路由配置 AbilitySlice路由配置 虽然一个Page可以包含多个AbilitySlice&#xff0c;但是Page进入前台时界面默认只展示一个AbilitySlice。默认展示的AbilitySlice是…

Java+SSM springboot+MySQL家政服务预约网站设计en24b

随着社区居民对生活品质的追求以及社会老龄化的加剧&#xff0c;社区居民对家政服务的需求越来越多&#xff0c;家政服务业逐渐成为政府推动、扶持和建设的重点行业。家政服务信息化有助于提高社区家政服务的工作效率和质量。 本次开发的家政服务网站是一个面向社区的家政服务网…