Vue3电商项目实战-商品详情模块3【07-★规格组件-SKUSPU概念、08-★规格组件-基础结构和样式、09-★规格组件-渲染与选中效果】

news2025/7/9 0:33:23

文章目录

    • 07-★规格组件-SKU&SPU概念
    • 08-★规格组件-基础结构和样式
    • 09-★规格组件-渲染与选中效果


07-★规格组件-SKU&SPU概念

官方话术:

  • SPU(Standard Product Unit):标准化产品单元。是商品信息聚合的最小单位,是一组可复用、易检索的标准化信息的集合,该集合描述了一个产品的特性。通俗点讲,属性值、特性相同的商品就可以称为一个SPU。
  • SKU(Stock Keeping Unit)库存量单位,即库存进出计量的单位, 可以是以件、盒、托盘等为单位。SKU是物理上不可分割的最小存货单元。在使用时要根据不同业态,不同管理模式来处理。

画图理解:

在这里插入图片描述

总结一下:

  • spu代表一个商品,拥有很多相同的属性。
  • sku代表该商品可选规格的任意组合,他是库存单位的唯一标识。

08-★规格组件-基础结构和样式

目标,完成规格组件的基础布局。

在这里插入图片描述

大致步骤:

  • 准备组件
  • 使用组件

落地代码:

  • 组件结构 src/views/goods/components/goods-sku.vue
<template>
  <div class="goods-sku">
    <dl>
      <dt>颜色</dt>
      <dd>
        <img class="selected" src="https://yanxuan-item.nosdn.127.net/d77c1f9347d06565a05e606bd4f949e0.png" alt="">
        <img class="disabled" src="https://yanxuan-item.nosdn.127.net/d77c1f9347d06565a05e606bd4f949e0.png" alt="">
      </dd>
    </dl>
    <dl>
      <dt>尺寸</dt>
      <dd>
        <span class="disabled">10英寸</span>
        <span class="selected">20英寸</span>
        <span>30英寸</span>
      </dd>
    </dl>
    <dl>
      <dt>版本</dt>
      <dd>
        <span>美版</span>
        <span>港版</span>
      </dd>
    </dl>
  </div>
</template>
<script>
export default {
  name: 'GoodsSku'
}
</script>
<style scoped lang="less">
.sku-state-mixin () {
  border: 1px solid #e4e4e4;
  margin-right: 10px;
  cursor: pointer;
  &.selected {
    border-color: @xtxColor;
  }
  &.disabled {
    opacity: 0.6;
    border-style: dashed;
    cursor: not-allowed;
  }
}
.goods-sku {
  padding-left: 10px;
  padding-top: 20px;
  dl {
    display: flex;
    padding-bottom: 20px;
    align-items: center;
    dt {
      width: 50px;
      color: #999;
    }
    dd {
      flex: 1;
      color: #666;
      > img {
        width: 50px;
        height: 50px;
        .sku-state-mixin ();
      }
      > span {
        display: inline-block;
        height: 30px;
        line-height: 28px;
        padding: 0 20px;
        .sku-state-mixin ();
      }
    }
  }
}
</style>
  • 使用组件 src/views/goods/index.vue
+import GoodsSku from './components/goods-sku'

  name: 'XtxGoodsPage',
+  components: { GoodsRelevant, GoodsImage, GoodsSales, GoodsName, GoodsSku },
  setup () {
        <div class="spec">
          <!-- 名字区组件 -->
          <GoodsName :goods="goods" />
          <!-- 规格组件 -->
+          <GoodsSku />
        </div>

总结: 每一个按钮拥有selected disabled 类名,做 选中 和 禁用要用。

09-★规格组件-渲染与选中效果

目的:根据商品信息渲染规格,完成选中,取消选中效果。

大致步骤:

  • 依赖 goods.specs 渲染规格
  • 绑定按钮点击事件,完成选中和取消选中
    • 当前点的是选中,取消即可
    • 当前点的未选中,先当前规格按钮全部取消,当前按钮选中。

落的代码:src/views/goods/components/goods-sku.vue

<template>
  <div class="goods-sku">
    <dl v-for="item in goods.specs" :key="item.id">
      <dt>{{item.name}}</dt>
      <dd>
        <template v-for="val in item.values" :key="val.name">
          <img :class="{selected:val.selected}" @click="clickSpecs(item,val)" v-if="val.picture" :src="val.picture" :title="val.name">
          <span :class="{selected:val.selected}" @click="clickSpecs(item,val)" v-else>{{val.name}}</span>
        </template>
      </dd>
    </dl>
  </div>
</template>
<script>
export default {
  name: 'GoodsSku',
  props: {
    goods: {
      type: Object,
      default: () => ({ specs: [], skus: [] })
    }
  },
  setup (props) {
    const clickSpecs = (item, val) => {
      // 1. 选中与取消选中逻辑
      if (val.selected) {
        val.selected = false
      } else {
        item.values.forEach(bv => { bv.selected = false })
        val.selected = true
      }
    }
    return { clickSpecs }
  }
}
</script>

注意:处理后台数据不规范,规格属性顺序和sku属性顺序不一致问题 src/views/goods/index.vue 现在无需处理。

    findGoods('1369155859933827074').then(({ result }) => {
      // const sortSpecs = []
      // result.skus[0].specs.forEach(spec => {
      //   sortSpecs.push(result.specs.find(item => item.name === spec.name))
      // })
      // result.specs = sortSpecs
      result.skus.forEach(sku => {
        const sortSpecs = []
        result.specs.forEach(spec => {
          sortSpecs.push(sku.specs.find(item => item.name === spec.name))
        })
        sku.specs = sortSpecs
      })
      goods.value = result
    })

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

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

相关文章

二月天-课后程序(JAVA基础案例教程-黑马程序员编著-第五章-课后作业)

【案例5-5】 二月天 【案例介绍】 1.任务描述 二月是一个有趣的月份&#xff0c;平年的二月有28天&#xff0c;闰年的二月有29天。本例要求编写一个程序&#xff0c;从键盘输入年份&#xff0c;根据输入的年份计算这一年的2月有多少天。在计算二月份天数时&#xff0c;可以使…

【微信小程序】--创建第一个小程序项目项目文件的作用(二)

&#x1f48c; 所属专栏&#xff1a;【微信小程序开发教程】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &#…

华为OD机试 - 数组合并(C++) | 附带编码思路 【2023】

刷算法题之前必看 参加华为od机试,一定要注意不要完全背诵代码,需要理解之后模仿写出,通过率才会高。 华为 OD 清单查看地址:https://blog.csdn.net/hihell/category_12199283.html 华为OD详细说明:https://dream.blog.csdn.net/article/details/128980730 华为OD机试题…

[业务逻辑] 订单超时怎么处理

文章目录1.订单的过程分析2.JDK自带的延时队列 (单机)3.RabbitMQ的延时消息 (消息队列方案)4.RocketMQ的定时消息 (消息队列方案)5.Redis过期监听 (Redis方案)6.定时任务分布式批处理 (扫表轮训方案)7.总结1.订单的过程分析 一个订单流程中有许多环节要用到超时处理 买家超时未…

echarts 饼状图 label 既在内部显示数值(百分比),又显示外部指示线

需求 项目开发中&#xff0c;产品经理绘制的原型图中&#xff0c;需要前端实现一个饼状图&#xff0c;且既在饼图内部中 显示 百分比&#xff0c;又显示 外部指示线及数值&#xff0c;效果如下图所示&#xff1a; 查了下 Echarts 官网文档&#xff0c;需要配置 series 下的 la…

使用vs2022编译yolov5+tensorRT+cuda+cudnn代码进行混合编译

首先依赖有cuda、cudnn、tensorrt、protobuf&#xff0c;从Linux的代码直接移植过来这些库是没法使用的&#xff0c;需要下载对应win的下的版本&#xff0c;其中cuda、cudnn和tensorrt直接从官方下载即可&#xff0c;但是protobuf需要自己编译一下&#xff08;protobuf3.11.4&a…

unix高级编程-fork之后父子进程共享文件

~/.bash_profile:每个用户都可使用该文件输入专用于自己使用的shell信息,当用户登录时,该文件仅仅执行一次!默认情况下,他设置一些环境变量,执行用户的.bashrc文件. 这里我看到的是centos的操作&#xff0c;但我用的是debian系的ubuntu&#xff0c;百度了一下发现debian的在这里…

【数据挖掘实战】——基于水色图像的水质评价

项目地址&#xff1a;Datamining_project: 数据挖掘实战项目代码 目录 一、背景和挖掘目标 1、问题背景 2、水色分类 3、原始数据 4、挖掘目标 二、分析方法和过程 1、初步分析 2、总体流程 第1步&#xff1a;数据预处理——图像切割 第2步&#xff1a;特征提取 ​…

健身蓝牙耳机推荐,推荐五款适合健身的蓝牙耳机

出门运动健身&#xff0c;有音乐的陪伴是我们坚持运动的不懈动力&#xff0c;在健身当中佩戴的耳机&#xff0c;佩戴舒适度以及牢固程度是我们十分需要注意的&#xff0c;还不知道如何选择健身蓝牙耳机&#xff0c;可以看看下面这些运动蓝牙耳机分享。 1、南卡Runner Pro4骨传…

大bug!ChatGPT居然不懂最新的量子计算?

&#xff08;图片来源&#xff1a;网络&#xff09;近期&#xff0c;背靠微软的AI语言模型ChatGPT风靡全网&#xff0c;以社交媒体为传播媒介&#xff0c;仅5天&#xff0c;注册用户数就超过100万&#xff0c;2个月破亿。随后谷歌眼红不已&#xff0c;匆忙召开自研AI搜索工具Ba…

【Python】变量类型,赋值+多个变量赋值

嗨害大家好鸭~我是小熊猫(✿◡‿◡) 好像还有一些小伙伴还不是很会python的基础鸭~ 没关系啦~这不是还有我小熊猫嘛 ~ 源码资料电子书:点击此处跳转文末名片获取 Python 变量类型 变量是存储在内存中的值&#xff0c; 这就意味着在创建变量时会在内存中开辟一个空间。 基于…

java面试题-JUC集合类

ConcurrentHashMap1.为什么HashTable慢? 它的并发度是什么? 那么ConcurrentHashMap并发度是什么?首先&#xff0c;HashTable 是一种线程安全的哈希表&#xff0c;它内部使用的是同步锁来保证线程安全。在并发读写的场景下&#xff0c;同步锁会导致线程的阻塞&#xff0c;从而…

Linux 软件包安装

目录 通过源代码编译安装 通过RPM软件包安装 通过Yum软件仓库安装 配置本地Yum源 通过yum安装软件 通过Dnf软件仓库安装 Linux软件包安装有四种方式&#xff1a;源代码、RPM、Yum、Dnf安装四种方式 通过源代码编译安装 通过源代码编译安装可以根据需求定制软件&#xff…

Prefect 工作流中修改ray的地址

事情的起因 prefect 默认创建ray在127.0.0.1 上&#xff0c;我想在外网访问&#xff0c;想修改为0.0.0.0 尝试解决思路1&#xff08;可行&#xff09; 自己本地安装一个ray&#xff0c;但是连接不了redis重新安装redis&#xff0c;使用docker安装的docker 安装需要将redis.…

数据结构-算法的空间复杂度(1.2)

目录 1.空间复杂度 1.1 例子 1.2 空间的特殊性质 写在最后&#xff1a; 1.空间复杂度 空间复杂度也是一个数学表达式&#xff0c; 是对一个算法在运行过程中临时占用存储空间大小的量度。 他也是用大O渐进表示法。 1.1 例子 例1&#xff1a; 冒泡排序&#xff1a; v…

【C语言进阶】字符串函数与内存函数的学习与模拟实现

​ ​&#x1f4dd;个人主页&#xff1a;Sherry的成长之路 &#x1f3e0;学习社区&#xff1a;Sherry的成长之路&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;C语言进阶 &#x1f3af;长路漫漫浩浩&#xff0c;万事皆有期待 文章目录1.字符串处理函数介…

【设计模式】对象行为型模式

行为创建型模式 系列综述&#xff1a; 来源&#xff1a;该系列是主要参考《大话设计模式》和《设计模式(可复用面向对象软件的基础)》&#xff0c;其他详细知识点拷验来自于各大平台大佬的博客。 总结&#xff1a;汇总篇 如果对你有用&#xff0c;希望关注点赞收藏一波。 文章目…

【超分顶会详解+部署】ESRT:Transformer for Single Image Super-Resolution

文章目录ESRT1. 超分基本知识1.1 SRF1.2 xxx_img1.3 裁剪1.4 超分模型评估标准2. LCB、LTB 模块2.1 序列模型3. 损失函数4. 部署运行4.1 数据集4.1.1 训练集4.1.2 验证集4.1.3 测试集4.2 数据集转换4.3 训练4.4 测试4.5 效果ESRT ESRT&#xff08;Efficient Super-Resolution …

直播预告 | 企业如何轻松完成数据治理?火山引擎 DataLeap 给你一份实战攻略!

更多技术交流、求职机会&#xff0c;欢迎关注字节跳动数据平台微信公众号&#xff0c;回复【1】进入官方交流群 企业数字化转型正席卷全球&#xff0c;这不仅是趋势所在&#xff0c;也是企业发展必然面对的考题&#xff0c;也是企业最关心、最难决策的难题&#xff0c;数字化不…