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

文章目录

    • 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 = sortSpecsresult.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})


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部