Vue3实现 SKU 规格

news2024/11/25 12:33:46

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

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
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

56个Python技巧,轻松掌握Python高效开发!可以收藏~

1. 枚举 - enumerate 可以有参数哦 之前我们这样操作&#xff1a; i 0for item in iterable: print i, item i 1现在我们这样操作&#xff1a; for i, item in enumerate(iterable):print i, itemenumerate函数还可以接收第二个参数。就像下面这样&#xff1a; \>>…

三菱FX3U小项目—机床定时器延时启动

目录 一、项目描述 二、IO口分配 三、项目程序 四、总结 一、项目描述 为了防止工人操作失误&#xff0c;启动按钮需要按住1s后&#xff0c;设备才启动&#xff0c;启动后第一台电机启动10s后第二台电机自动启动&#xff0c;当按下停止按钮时&#xff0c;两台电机同时停止。…

OpenVPN服务器搭建与OpenVPN客户端访问

1.服务器搭建: 操作系统 ubuntu 22.04: 安装OpenVPN服务器前先更新系统 2.下载OpenVPN安装脚本: wget https://raw.githubusercontent.com/angristan/openvpn-install/master/openvpn-install.sh 3.给脚本运行权限: chmod +x openvpn-install.sh 4.运行脚本进行OpenVPN服务器…

这7个“小毛病”项目经理必须克服

大家好&#xff0c;我是老原。 项目经理干项目可能不在行&#xff0c;但“踩坑”、“背锅”一定在行。 当上项目经理不容易&#xff0c;当好项目经理更不容易&#xff0c;有永远填不完的坑和背不完的锅。 如果要问项目经理都踩过哪些坑&#xff0c;那真的是太多了&#xff0…

【创作活动】作为程序员的那些愚蠢瞬间

作为一名程序员&#xff0c;我相信你一定遇到过这种情况&#xff1a;在写代码的时候&#xff0c;遇到了一些bug&#xff0c;在当下怎么检查都查不出问题出现在哪&#xff0c;等过几天后突然发现困扰自己的问题原来这么简单&#xff0c;突然觉得自己很蠢。这种情况在我身上也发生…

制造企业MES管理系统解决方案的深化应用

随着制造业的发展&#xff0c;生产车间管理一直是企业面临的难题。生产过程繁忙而混乱&#xff0c;信息不流通&#xff0c;生产效率低下等问题频发。为了解决这些问题&#xff0c;企业管理者急需寻找有效的解决方案。这时&#xff0c;MES管理系统解决方案应运而生&#xff0c;成…

第四代智能井盖传感器:万宾科技助力城市安全

在繁华喧嚣的城市里人来人往&#xff0c;井盖作为基础设施的一个组成部分在路面上分布范围广。然而这些看似普通的井盖却存在着位移、水浸的风险&#xff0c;可能给我们的生活带来诸多不便&#xff0c;更会威胁到我们的人身安全。如何有效监测和管理井盖的状态&#xff0c;成为…

计算机毕业设计选题推荐-一周穿搭推荐微信小程序/安卓APP-项目实战

✨作者主页&#xff1a;IT研究室✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…

计算机视觉基础(8)——齐次坐标系与相机内外参

前言 本节我们将学习到透视投影、齐次坐标系等基础知识&#xff0c;在这些基础知识上&#xff0c;进一步了解到相机的参数&#xff0c;相机参数分为相机外参和相机内参&#xff0c;相机外参是从世界坐标系到相机坐标系&#xff0c;相机内参是从相机坐标系到图像坐标系。 一、透…

winform+access超市管理信息系统

说明文档 主要技术&#xff1a; 基于C#winform架构和access数据库 功能模块&#xff1a; 登陆和对access数据库的一些简单操作&#xff0c;只适合新手学习看看 运行环境&#xff1a; 运行需vs2013或者以上版本&#xff0c;sql server 2012或者以上版本。附送有运行说明文档。…

ROS Turtlebot3多机器人编队导航仿真

文章目录 前言一、Gzazebo中加载多台Turtlebot3机器人二、RVIZ中加载多个Turtlebot3机器人三.多机器人编队导航总结 前言 前面已经实现了在gazebo仿真环境中机器人一字型编队、三角形编队、N字型编队等仿真&#xff0c;接下来考虑多机器人编队在编队行进过程中的避障问题&…

EtherCAT从站EEPROM组成信息详解(3):字16-63邮箱、EEPROM信息

0 工具准备 1.EtherCAT从站EEPROM数据&#xff08;本文使用DE3E-556步进电机驱动器&#xff09;1 字10-63邮箱、EEPROM信息 1.1 字10-63组成规范 字10-63虽然包含的空间区域很大&#xff0c;但实际上仅包含引导状态下邮箱配置、标准邮箱配置、EEPROM大小、执行的SII标准版本…

无需API实现MySQL与巨量引擎的对接

通过数环通&#xff0c;您可以使用不到几分钟的时间即可实现MySQL与巨量引擎的对接与集成&#xff0c;从而高效实现工作流程自动化&#xff0c;降本增效&#xff01; 1.产品介绍 巨量引擎是字节跳动旗下的营销服务品牌&#xff0c;它整合了字节跳动旗下的产品及海量内容&#…

SQL自学三部曲_Part3:关于SQL必须要知道的一切

文章目录 一、关于SQL必须要知道的一切&#xff08;1&#xff09;SQL是什么?&#xff08;2&#xff09;你为什么要学SQL?&#xff08;3&#xff09;SQL到底要学什么? 二、 SQL学习的三个阶段&#xff08;1&#xff09;理解运行原理&#xff0c;串联核心语句&#xff08;2&am…

基于IDEA创建Maven工程及注意事项

Java全能学习面试指南&#xff1a;https://javaxiaobear.cn 1. 概念梳理Maven工程的GAVP Maven工程相对之前的项目&#xff0c;多出一组gavp属性&#xff0c;gav需要我们在创建项目的时候指定&#xff0c;p有默认值&#xff0c;我们先行了解下这组属性的含义&#xff1a; Ma…

Apache Airflow (八) :DAG任务依赖设置

&#x1f3e1; 个人主页&#xff1a;IT贫道_大数据OLAP体系技术栈,Apache Doris,Clickhouse 技术-CSDN博客 &#x1f6a9; 私聊博主&#xff1a;加入大数据技术讨论群聊&#xff0c;获取更多大数据资料。 &#x1f514; 博主个人B栈地址&#xff1a;豹哥教你大数据的个人空间-豹…

Django测试环境搭建及ORM查询(创建外键|跨表查询|双下划线查询 )

文章目录 一、表查询数据准备及测试环境搭建模型层前期准备测试环境搭建代码演示 二、ORM操作相关方法三、ORM常见的查询关键字四、ORM底层SQL语句五、双下划线查询数据查询&#xff08;双下划线&#xff09;双下划线小训练Django ORM __双下划线细解 六、ORM外键字段创建基础表…

JS进阶——作用域、解构、箭头函数

1、作用域 作用域&#xff08;scope&#xff09;规定了变量能够被访问的“范围”&#xff0c;离开了这个“范围”变量便不能被访问。 1.1 局部作用域 局部作用域可分为函数作用域和块作用域。 1.1.1 函数作用域 在函数内部声明的变量只能在函数内部被访问&#xff0c;外部无…

把jar包打到本地仓库然后上传到私服

1.首先把需要打成maven的包放到本地 2.然后本地配置maven的环境变量 没有配置的话可以看看下面这个&#xff0c;教程很详细 Windows系统配置maven环境_windows配置maven环境变量-CSDN博客 3.WinR cmd 输入如下的指令&#xff1a; mvn install:install-file -Dfile.\device…