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">
        <li
          v-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.value
  const 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.name
    subIndex.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].name
      arrt[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
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

OpenCV的应用——道路边缘检测

OpenCV&#xff08;Open Source Computer Vision Library&#xff09;是一个开源的计算机视觉库&#xff0c;它提供了丰富的图像处理和计算机视觉算法&#xff0c;使得开发者可以便捷地进行图像处理、对象识别、图像分割等任务。道路边缘检测是计算机视觉中的重要应用之一&…

Hive入门--学习笔记

1&#xff0c;Apache Hive概述 定义&#xff1a; Hive是由Facebook开源用于解决海量结构化日志的数据统计&#xff0c;它是基于大数据生态圈Hadoop的一个数据仓库工具。 作用&#xff1a; Hive可以用于将结构化的数据文件【映射】为一张表&#xff0c;并提供类SQL查询功能。 H…

前端实现RSA非对称加密及生成RSA公私密钥

前端实现RSA非对称加密 RSA简介安装jsencryptRSA加密RSA解密如何生成公私秘钥&#xff08;windows&#xff09; RSA简介 RSA用于保密性时&#xff0c;就是公钥加密&#xff0c;私钥解密。 因为公钥是可以公开了&#xff0c; 那么任何人都可以使用公钥对信息进行加密&#xff0…

嵌入式Linux开发,NFS文件系统挂载

在嵌入式linix的开发中&#xff0c;经常会需要在pc端和板端互相传输文件&#xff0c;优先可选择ftp传输&#xff0c;但是有些嵌入式板端不支持&#xff0c;只能使用nfs这种方式&#xff0c;即pc端作为服务端&#xff0c;板端作为客户端&#xff0c;将pc端的某个文件夹挂载到板端…

时间序列预测各类算法探究上篇

前言&#xff1a; 最近项目需要对公司未来业绩进行预测&#xff0c;以便优化决策&#xff0c;so 研究一下时序算法。纯个人理解&#xff0c;记录以便备用&#xff08;只探究一下原理&#xff0c;所有算法都使用基本状态&#xff0c;并未进行特征及参数优化&#xff09;。 环境…

Windows本地配置带GPU的Pytorch环境

首先需要安装并配置好Anaconda环境&#xff0c;安装教程教程随便找一个就好。 第一步&#xff1a;安装好之后创建conda虚拟环境&#xff1a; conda create -n your_env_name pythonx.x 第二步&#xff1a;安装需要版本的pytorch&#xff1a;pytorch下载链接 cu100/torch-1.2…

很多工程师,最后都是被生活裹挟,没法一直在技术路径走到极致

最近比较少更了&#xff0c;但内容一直在写&#xff0c;只是从长文变成了短文&#xff0c;直接发朋友圈了。 如果喜欢我写的内容&#xff0c;请移步到朋友圈。 我是一个不喜欢讲哲理的人&#xff0c;感觉哲学都是理论&#xff0c;都是鸡血&#xff0c;很难落地&#xff0c;我…

Android开发中遇到的问题请求帮助分析解决

本篇文章主要寻求广大的网友&#xff0c;对我遇到的问题进行分析解答&#xff0c;希望能给出更好的&#xff0c;更优化的方法。话不多说先上遇到的问题的流程图的分析&#xff1a; 以上就是流程分析图&#xff0c;希望能够尽快解决&#xff0c;希望得到大家的支持。再次本人非常…

(Matalb回归预测)GWO-BP灰狼算法优化BP神经网络的多维回归预测

目录 一、程序及算法内容介绍&#xff1a; 基本内容&#xff1a; 亮点与优势&#xff1a; 二、实际运行效果&#xff1a; 三、部分代码&#xff1a; 四、完整程序数据使用说明下载&#xff1a; 一、程序及算法内容介绍&#xff1a; 基本内容&#xff1a; 本代码基于Mata…

比特币上的人工智能

以感知机为例 人工智能&#xff0c;尤其是机器学习形式的人工智能&#xff0c;最近取得了巨大的进步&#xff0c;应用范围从人脸识别到自动驾驶汽车。我们建议将 AI 与比特币区块链结合起来&#xff0c;以获得许多其他方式无法实现的显着优势&#xff1a; 公开透明&#xff1a…

腾讯云新用户优惠券如何领取?详细教程来了!

腾讯云一直致力于为广大用户提供优质、高效的云计算服务。为了吸引新用户&#xff0c;腾讯云推出了新用户专属优惠券&#xff0c;本文将详细介绍如何领取腾讯云新用户优惠券&#xff0c;助力大家轻松上云&#xff01; 一、腾讯云新用户优惠券领取 领券入口&#xff1a;https:/…

《Linux从练气到飞升》No.28 Linux中的线程同步

&#x1f57a;作者&#xff1a; 主页 我的专栏C语言从0到1探秘C数据结构从0到1探秘Linux菜鸟刷题集 &#x1f618;欢迎关注&#xff1a;&#x1f44d;点赞&#x1f64c;收藏✍️留言 &#x1f3c7;码字不易&#xff0c;你的&#x1f44d;点赞&#x1f64c;收藏❤️关注对我真的…

网络超时检测-11.9

应用场景 在网络通信中&#xff0c;很多操作会使得进程阻塞&#xff1a; TCP套接字中的recv/acceptUDP套接字中的recvfrom超时检测的必要性 避免进程在没有数据时无限制地阻塞实现某些特定协议要求&#xff0c;比如某些设备规定&#xff0c;发送请求数据后&#xff0c;如果多长…

TCP连接保活机制

在TCP连接中有一个保活机制&#xff0c;叫做Keep-Alive&#xff0c;用语言描述就是如下&#xff1a; 在保活时间内&#xff0c;如果没有任何连接相关的活动&#xff0c;TCP 保活机制会开始作用&#xff0c;每隔一个时间间隔&#xff08;保活时间间隔&#xff09;&#xff0c;发…

王道数据结构课后代码题p19 第14题请设计一个尽可能高效的算法,计算并输出所有可能的三元组(a,b,c) 中的最小距离。(c语言代码实现)

本题其实就是找a到c的最小值 有讲解p19 第14题 c语言实现王道数据结构课后代码题_哔哩哔哩_bilibili 下方有图&#xff1a; 本题代码如下 int abs(int a)//计算绝对值 {if (a < 0)return -a;elsereturn a; } int min(int a, int b, int c)//a是否为三个数中的最小值 {if …

技巧篇:在Pycharm中配置集成Git

一、在Pycharm中配置集成Git 我们使用git需要先安装git工具&#xff0c;这里给出下载地址&#xff0c;下载后一路直接安装即可&#xff1a; https://git-for-windows.github.io/ 0. git中的一些常用词释义 Repository name&#xff1a; 仓库名称 Description(可选)&#xff1a;…

某建筑网页js逆向分析过程(有坑)

某建筑网页&#xff1a; 网站&#xff1a; import base64 # 解码 website base64.b64decode(aHR0cHM6Ly9qenNjLm1vaHVyZC5nb3YuY24vZGF0YS9jb21wYW55.encode(utf-8)) print(website)JSON.parse() ​ 当你有一个包含JSON字符串的变量时&#xff0c;你可以使用JSON.parse()将…

photoshop插件开发入门

photoshop 学习资料和sdk 下载地址https://developer.adobe.com/console/servicesandapis/ps 脚本编程文档 官方文档&#xff1a; https://extendscript.docsforadobe.dev/ 官方文档&#xff1a; https://helpx.adobe.com/hk_en/photoshop/using/scripting.html open(new F…

蓝桥杯 string

string简介 string是C标准库的重要组成部分&#xff0c;主要用于字符串处理。 使用string库需要在头文件中包括该库 #include< string> string与char[]不同&#xff0c;string实现了高度的封装&#xff0c;可以很方便地完 成各种字符串的操作&#xff0c;比如拼接、截取…

面试题-2

1.重绘和重排有什么区别 重排(回流):布局引擎会根据所有的样式计算出盒模型在页面上的位置和大小 重绘:计算好盒模型的位置,大小和其他一些属性之后,浏览器就会根据每个盒模型的特性进行绘制 浏览器的渲染机制: 对DOM的大小,位置进行修改后,浏览器需要重新计算元素的这些几何…