Vue3实现 SKU 规格

效果图
在这里插入图片描述

1 HTML 基本结构

1.1 遍历 SKU 规格数据

<template><div class="productConten"><div v-for="(productItem, productIndex) in specifications" :key="productItem.name"><div class="productTitle">{{ productItem.name }}</div><ul class="productItem"><liv-for="(oItem, oIndex) in productItem.item":key="oItem.name"@click="selectArrtBtn(oItem, productIndex, oIndex)":class="{ noneActive: !oItem.checked, active: subIndex[productIndex] == oIndex }">{{ oItem.name }}</li></ul></div></div><div v-if="boxArr.id">{{ boxArr.difference + '--' + boxArr.price }}</div>
</template>

2 编写 css 基本样式

<style lang="scss" scoped>
.productConten {width: 500px;padding: 40px;.productTitle {font-weight: 500;margin: 10px 0;}.productItem {display: flex;margin-bottom: 30px;li {background: #fff;color: #000;padding: 4px 10px;border: 1px solid #eee;margin-right: 10px;}.noneActive {background-color: #ccc;opacity: 0.4;color: #000;pointer-events: none;}.active {background-color: #c41e3a;color: #fff;border: 1px solid #c41e3a;}}
}
</style>

3 js 代码

<script setup>
import { onMounted, ref } from 'vue'
// 规格数据
const specifications = ref([{name: '颜色',item: [{ name: '白色' }, { name: '黑色' }, { name: '红色' }]},{name: '尺码',item: [{ name: 'x' }, { name: 'xl' }]}
])
// 商品仓库数据
const dataList = ref([{id: '19',price: '200.00',stock: '19',difference: '红色,x'},{id: '20',price: '300.00',stock: '29',difference: '白色,x'},{id: '21',price: '300.00',stock: '10',difference: '黑色,x'},{id: '21',price: '300.00',stock: '10',difference: '黑色,xl'},{id: '24',price: '500.00',stock: '10',difference: '白色,xl'}
])
//存放要和选中的值进行匹配的数据
const shopItemInfo = ref({})
//存放被选中的值
const selectArr = ref([])
//是否选中 因为不确定是多规格还是单规格,所以这里定义数组来判断
const subIndex = ref([])
const boxArr = ref({})onMounted(() => {const difference = dataList.valueconst attrList = specifications.value// 1 修改数据结构格式,改成键值对的方式,以方便和选中之后的值进行匹配for (let i = 0; i < difference.length; i++) {shopItemInfo.value[difference[i].difference] = difference[i]}// 2 给每个规格的选项添加一个checked属性,用来判断是否选中for (let i = 0; i < attrList.length; i++) {for (let j = 0; j < attrList[i].item.length; j++) {attrList[i].item[j].checked = true}}specifications.value = attrList
})/*** 点击选择规格* @param {Object} item 规格的值* @param {Number} index 规格标题的索引* @param {Number} arrtIndex 规格的索引* */
const selectArrtBtn = (item, index, arrtIndex) => {// 1 如果数组中没有选中的值,就添加到数组中,有则清空之前选中的值if (selectArr.value[index] != item.name) {selectArr.value[index] = item.namesubIndex.value[index] = arrtIndex} else {selectArr.value[index] = ''// 去掉选中的颜色subIndex.value[index] = -1}checkItem()// 3 在能选中的值中查找是否有const selectObj = shopItemInfo.value[selectArr.value]if (selectObj) {boxArr.value = selectObj}
}
const checkItem = () => {const arrt = specifications.value// 定义数组存储被选中的值let result = []for (let i in arrt) {result[i] = selectArr.value[i] ? selectArr.value[i] : ''}for (let i in arrt) {// 把选中的值提取出来let last = result[i]for (let k in arrt[i].item) {result[i] = arrt[i].item[k].namearrt[i].item[k].checked = isMay(result)}// 还原,目的是记录点下去那个值,避免下一次执行循环时被覆盖result[i] = last}specifications.value = arrt
}const isMay = (result) => {for (let i in result) {if (result[i] == '') return true}return !shopItemInfo.value[result] ? false : shopItemInfo.value[result]?.stock == 0 ? false : true
}

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

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

相关文章

CUDA安装

在cmd中输入nvidia-smi。显示CUDA Version&#xff1a;12.3&#xff0c;所以只能下载小于等于12.3的版本。如下图&#xff1a; 进这个网址&#xff1a;https://developer.nvidia.com/cuda-toolkit-archive 选择一个版本下载。 选择完后之后这样选择&#xff1a; 最后点击下载即…

IDEA软件使用步骤

1.IDEA概述 IDEA全称InelliJ IDEA,是用于java语言开发的集成环境&#xff0c;它是业界公认的目前用于Java程序开发最好的工具。 集成环境&#xff1a;把代码编写&#xff0c;编译&#xff0c;执行&#xff0c;调试扽过多种功能综合到一起的开发工具。 下载&#xff1a;https…

群晖Docker(Container Manager)中安装Home Assistant Container

群晖Docker&#xff08;Container Manager&#xff09;中安装Home Assistant Container 不要使用 套件里面的 Home Assistant&#xff0c;不利于后期拓展 方式一&#xff1a; docker run -d --name"home-assistant-1" -v /volume1/docker/homeassistant/config:/c…

docker安装SMQTT

docker安装SMQTT smqtt介绍 官方地址: https://www.smqtt.cc/ 官方文档地址: https://wiki.smqtt.cc/docs/smqtt/ 一款高性能&开源的MQTT服务器&#xff0c;支持单机、容器化、集群部署&#xff0c;支持多种协议&#xff0c;具备低延迟&#xff0c;高吞吐量&#xff0c;…

NSSCTF第12页(2)

[CSAWQual 2019]Unagi 是xxe注入&#xff0c;等找时间会专门去学一下 XML外部实体&#xff08;XXE&#xff09;注入 - 知乎 【精选】XML注入学习-CSDN博客 【精选】XML注入_xml注入例子-CSDN博客 题目描述说flag在/flag下 发现有上传点&#xff0c;上传一句话木马试试 文件…

解锁数据潜力:为什么你应该考虑使用向量数据库

文章目录 前言什么是向量和向量数据库使用示例Amazon OpenSearch Serverless向量引擎总结 前言 根据DC调查数据显示&#xff0c;全球在A1技术和服务上的支出2023年将达到1540亿美元&#xff0c;到2026年将超过3000亿美元。其中&#xff0c;向量数据库为AI的开发、增强内容生成…

保姆级jupyter lab配置清单

❤️觉得内容不错的话&#xff0c;欢迎点赞收藏加关注&#x1f60a;&#x1f60a;&#x1f60a;&#xff0c;后续会继续输入更多优质内容❤️ &#x1f449;有问题欢迎大家加关注私戳或者评论&#xff08;包括但不限于NLP算法相关&#xff0c;linux学习相关&#xff0c;读研读博…

用嘉立创查找元件的原理图

目录 1.打开立创商城 2.搜索元件 ​编辑 3.复制编号 ​编辑 4.打开元件库 5.将复制好的编号进行搜索 1.打开立创商城 2.搜索元件 3.复制编号 4.打开元件库 5.将复制好的编号进行搜索

土木非科班转码测开,斩获10家大厂offer

大家好&#xff0c;我是洋子 24届秋招基本已经落下了帷幕&#xff0c;各大互联网大厂基本也开奖完毕&#xff0c;还没有拿到满意offer的同学也不要灰心&#xff0c;积极备战明年的春招。另外&#xff0c;25届想要找暑期实习的同学也可以开始准备起来了&#xff0c;基本大厂在春…

systemverilog:interface中的modport用法

使用modport可以将interface中的信号分组并指定方向&#xff0c;方向是从modport连接的模块看过来的。简单示例如下&#xff1a; interface cnt_if (input bit clk);logic rstn;logic load_en;logic [3:0] load;logic [7:0] count;modport TEST (input clk, count,output rst…

接口自动化测试用例编写规范

一、接口自动化测试用例设计方法 1.1接口参数覆盖 接口测试通过输入使用参数组合&#xff0c;获得服务器返回值&#xff0c;并根据预先设定的规则判断是否符合预期值。在接口测试中&#xff0c;根据接口的功能不同&#xff0c;需要侧重检测的方面也不同。主要从以下几个方面考…

python 基础语法 (常常容易漏掉)

同一行显示多条语句 python语法中要求缩进&#xff0c;但是同一行可以显示多条语句 在 Python 中&#xff0c;可以使用分号 (;) 将多个语句放在同一行上。这样可以在一行代码中执行多个语句&#xff0c;但需要注意代码的可读性和维护性。 x 5; y 10; z x y; print(z) 在…