SKU 模块丨前端uniapp微信小程序项目

2023-10-30

小兔鲜儿 - SKU 模块

学会使用插件市场,下载并使用 SKU 组件,实现商品详情页规格展示和交互。

存货单位(SKU)

SKU 概念

存货单位(Stock Keeping Unit),库存管理的最小可用单元,通常称为“单品”。

SKU 常见于电商领域,对于前端工程师而言,更多关注 SKU 算法用户交互体验

插件市场

uni-app 插件市场,是 uni-app 官方插件生态集中地。

SKU 属于电商常见业务,插件市场有现成的 SKU 插件,我们下载并在项目中使用。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

下载 SKU 插件

经过综合评估,我们选择该SKU 插件,请下载插件到本地。

体验地址

::: tip 常见问题

Q:如何评估第三方插件的质量?

A:查看插件的评分、评价、下载量、更新频率以及文档完整性,以确保插件具有良好的社区口碑、兼容性、性能和维护状况。

:::

使用 SKU 插件

组件安装到自己项目

  1. 复制 vk-data-goods-sku-popupvk-data-input-number-box 到项目的根 components 目录下。
  2. 复制例子代码并运行体验。

插件文档(部分)

Props 参数 说明 类型 默认值 可选值
v-model 双向绑定,true 为打开组件,false 为关闭组件 Boolean false true、false
mode 模式 1:都显示 2:只显示购物车 3:只显示立即购买 Number 1 1、2、3
localdata 商品信息本地数据源 Object - -
Event 事件名 说明 回调参数
add-cart 点击添加到购物车时(需选择完 SKU 才会触发) selectShop:当前选择的 sku 数据
buy-now 点击立即购买时(需选择完 SKU 才会触发) selectShop:当前选择的 sku 数据
open 打开组件时
close 关闭组件时

::: tip 常见问题

Q:为什么插件使用时无需导入?

A:pages.jsoneasycom 配置中,默认自动扫描 xxx/xxx.vue 格式的组件,实现自动导入

Q:为什么组件代码 Git 提交时报错?

A:插件未采用 eslint 校验代码,请在插件源文件中添加 /* eslint-disable */,禁用 eslint

:::

vk-data-goods-sku-popup.vuevk-data-input-number-box.vue 组件禁用 eslint

<script>
/* eslint-disable */
// 省略组件源代码
</script>

插件类型问题

尽管该插件未采用 TS 开发,但作者提供了详细的插件文档,我们可以依据文档为插件添加 TS 类型声明文件,从而提高项目数据校验的安全性。

类型声明文件

vk-data-goods-sku-popup.d.ts

import { Component } from '@uni-helper/uni-app-types'

/** SKU 弹出层 */
export type SkuPopup = Component<SkuPopupProps>

/** SKU 弹出层实例 */
export type SkuPopupInstanceType = InstanceType<SkuPopup>

/** SKU 弹出层属性 */
export type SkuPopupProps = {
  /** 双向绑定,true 为打开组件,false 为关闭组件 */
  modelValue: boolean
  /** 商品信息本地数据源 */
  localdata: SkuPopupLocaldata
  /** 按钮模式 1:都显示 2:只显示购物车 3:只显示立即购买 */
  mode?: 1 | 2 | 3
  /** 该商品已抢完时的按钮文字 */
  noStockText?: string
  /** 库存文字 */
  stockText?: string
  /** 点击遮罩是否关闭组件 */
  maskCloseAble?: boolean
  /** 顶部圆角值 */
  borderRadius?: string | number
  /** 最小购买数量 */
  minBuyNum?: number
  /** 最大购买数量 */
  maxBuyNum?: number
  /** 每次点击后的数量 */
  stepBuyNum?: number
  /** 是否只能输入 step 的倍数 */
  stepStrictly?: boolean
  /** 是否隐藏库存的显示 */
  hideStock?: false
  /** 主题风格 */
  theme?: 'default' | 'red-black' | 'black-white' | 'coffee' | 'green'
  /** 默认金额会除以100(即100=1元),若设置为0,则不会除以100(即1=1元) */
  amountType?: 1 | 0
  /** 自定义获取商品信息的函数(已知支付宝不支持,支付宝请改用localdata属性) */
  customAction?: () => void
  /** 是否显示右上角关闭按钮 */
  showClose?: boolean
  /** 关闭按钮的图片地址 */
  closeImage?: string
  /** 价格的字体颜色 */
  priceColor?: string
  /** 立即购买 - 按钮的文字 */
  buyNowText?: string
  /** 立即购买 - 按钮的字体颜色 */
  buyNowColor?: string
  /** 立即购买 - 按钮的背景颜色 */
  buyNowBackgroundColor?: string
  /** 加入购物车 - 按钮的文字 */
  addCartText?: string
  /** 加入购物车 - 按钮的字体颜色 */
  addCartColor?: string
  /** 加入购物车 - 按钮的背景颜色 */
  addCartBackgroundColor?: string
  /** 商品缩略图背景颜色 */
  goodsThumbBackgroundColor?: string
  /** 样式 - 不可点击时,按钮的样式 */
  disableStyle?: object
  /** 样式 - 按钮点击时的样式 */
  activedStyle?: object
  /** 样式 - 按钮常态的样式 */
  btnStyle?: object
  /** 字段名 - 商品表id的字段名 */
  goodsIdName?: string
  /** 字段名 - sku表id的字段名 */
  skuIdName?: string
  /** 字段名 - 商品对应的sku列表的字段名 */
  skuListName?: string
  /** 字段名 - 商品规格名称的字段名 */
  specListName?: string
  /** 字段名 - sku库存的字段名 */
  stockName?: string
  /** 字段名 - sku组合路径的字段名 */
  skuArrName?: string
  /** 字段名 - 商品缩略图字段名(未选择sku时) */
  goodsThumbName?: string
  /** 被选中的值 */
  selectArr?: string[]

  /** 打开弹出层 */
  onOpen: () => void
  /** 关闭弹出层 */
  onClose: () => void
  /** 点击加入购物车时(需选择完SKU才会触发)*/
  onAddCart: (event: SkuPopupEvent) => void
  /** 点击立即购买时(需选择完SKU才会触发)*/
  onBuyNow: (event: SkuPopupEvent) => void
}

/**  商品信息本地数据源 */
export type SkuPopupLocaldata = {
  /** 商品 ID */
  _id: string
  /** 商品名称 */
  name: string
  /** 商品图片 */
  goods_thumb: string
  /** 商品规格列表 */
  spec_list: SkuPopupSpecItem[]
  /** 商品SKU列表 */
  sku_list: SkuPopupSkuItem[]
}

/** 商品规格名称的集合 */
export type SkuPopupSpecItem = {
  /** 规格名称 */
  name: string
  /** 规格集合 */
  list: { name: string }[]
}

/** 商品SKU列表 */
export type SkuPopupSkuItem = {
  /** SKU ID */
  _id: string
  /**  商品 ID */
  goods_id: string
  /** 商品名称 */
  goods_name: string
  /** 商品图片 */
  image: string
  /** SKU 价格 * 100, 注意:需要乘以 100 */
  price: number
  /** SKU 规格组成, 注意:需要与 spec_list 数组顺序对应 */
  sku_name_arr: string[]
  /** SKU 库存 */
  stock: number
}

/** 当前选择的sku数据 */
export type SkuPopupEvent = SkuPopupSkuItem & {
  /** 商品购买数量 */
  buy_num: number
}

/** 全局组件类型声明 */
declare module '@vue/runtime-core' {
  export interface GlobalComponents {
    'vk-data-goods-sku-popup': SkuPopup
  }
}

核心业务

渲染商品规格

使用以下两个属性:

  • localdata 绑定商品 SKU 数据来源
  • v-model 双向绑定,显示/隐藏组件

注意:后端返回的数据格式和插件所需的格式不一致,我们需要按插件要求进行处理。

<script setup lang="ts">
import type { SkuPopupLocaldata } from '@/components/vk-data-goods-sku-popup/vk-data-goods-sku-popup'

// 获取商品详情信息
const goods = ref<GoodsResult>()
const getGoodsByIdData = async () => {
  const res = await getGoodsByIdAPI(query.id)
  goods.value = res.result
  // SKU组件所需格式
  localdata.value = {
    _id: res.result.id,
    name: res.result.name,
    goods_thumb: res.result.mainPictures[0],
    spec_list: res.result.specs.map((v) => ({ name: v.name, list: v.values })),
    sku_list: res.result.skus.map((v) => ({
      _id: v.id,
      goods_id: res.result.id,
      goods_name: res.result.name,
      image: v.picture,
      price: v.price * 100, // 注意:需要乘以 100
      stock: v.inventory,
      sku_name_arr: v.specs.map((vv) => vv.valueName),
    })),
  }
}

// 是否显示SKU组件
const isShowSku = ref(false)
// 商品信息
const localdata = ref({} as SkuPopupLocaldata)
</script>

<template>
  <!-- SKU弹窗组件 -->
  <vk-data-goods-sku-popup v-model="isShowSku" :localdata="localdata" />
  <!-- 弹窗测试 -->
  <button @tap="isShowSku = true">打开 SKU 弹窗</button>
</template>

打开弹窗交互

SKU 弹窗的按钮有三种形式。

<script setup lang="ts">
// 按钮模式
enum SkuMode {
  Both = 1,
  Cart = 2,
  Buy = 3,
}
const mode = ref<SkuMode>(SkuMode.Cart)
// 打开SKU弹窗修改按钮模式
const openSkuPopup = (val: SkuMode) => {
  // 显示SKU弹窗
  isShowSku.value = true
  // 修改按钮模式
  mode.value = val
}
</script>

<template>
  <!-- SKU弹窗组件 -->
  <vk-data-goods-sku-popup
    v-model="isShowSku"
    :localdata="localdata"
    :mode="mode"
    add-cart-background-color="#FFA868"
    buy-now-background-color="#27BA9B"
  />

  <!-- 显示两个按钮 -->
  <view @tap="openSkuPopup(SkuMode.Both)" class="item arrow"
    >请选择商品规格</view
  >
  <!-- 显示一个按钮 -->
  <view @tap="openSkuPopup(SkuMode.Cart)" class="addcart"> 加入购物车 </view>
  <view @tap="openSkuPopup(SkuMode.Buy)" class="payment"> 立即购买 </view>
</template>

渲染被选中的值

  1. 通过 ref 获取组件实例。

  2. 通过 computed 计算出被选中的值,渲染到界面中。

<script setup lang="ts">
// SKU组件实例
const skuPopupRef = ref<SkuPopupInstance>()
// 计算被选中的值
const selectArrText = computed(() => {
  return skuPopupRef.value?.selectArr?.join(' ').trim() || '请选择商品规格'
})
</script>

<template>
  <!-- SKU弹窗组件 -->
  <vk-data-goods-sku-popup
    v-model="isShowSku"
    :localdata="localdata"
    :mode="mode"
    add-cart-background-color="#FFA868"
    buy-now-background-color="#27BA9B"
    ref="skuPopupRef"
    :actived-style="{
      color: '#27BA9B',
      borderColor: '#27BA9B',
      backgroundColor: '#E9F8F5',
    }"
  />
  <!-- 操作面板 -->
  <view class="action">
    <view @tap="openSkuPopup(SkuMode.Both)" class="item arrow">
      <text class="label">选择</text>
      <text class="text ellipsis"> {{ selectArrText }} </text>
    </view>
  </view>
</template>

至此,已经完成 SKU 组件的交互,接下来进入到购物车模块,并实现加入购物车功能。

视频学习 》 》》

黑马程序员前端项目uniapp小兔鲜儿微信小程序项目视频教程

全网首套用 vue3 加 TS 写的 uniapp 项目, 里面大量封装自己的组件库,课程从 uni-app 基础入手,按照9大电商业务模块逐步实现完整的电商购物流程业务;涵盖了猜你喜欢、热门推荐、商品分类、商品详情、微信登录、用户管理、地址管理、购物车管理、订单管理等功能。包含微信登录,微信支付等业务。一套代码多端全面覆盖微信小程序端、H5端、APP端。

教程笔记更新中

1 、前端项目uniapp小兔鲜儿微信小程序项目起步
2 、首页模块丨前端uniapp微信小程序项目
3 、推荐模块丨前端uniapp微信小程序项目
4 、分类模块丨前端uniapp微信小程序项目
5 、商品详情丨前端uniapp微信小程序项目
6 、登录模块丨前端uniapp微信小程序项目
7 、用户模块丨前端uniapp微信小程序项目
8 、地址模块丨前端uniapp微信小程序项目

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SKU 模块丨前端uniapp微信小程序项目 的相关文章

  • NATAPP使用详细教程(免费隧道内网映射)

    NATAPP https natapp cn tunnel lists NATAPP 在开发时可能会有将自己开发的机器上的应用提供到公网上进行访问 但是并不想通过注册域名 搭建服务器 由此可以使用natapp 内网穿透 购买免费隧道 修改隧
  • 动手学强化学习Day1-基本概念

    文章目录 1 1 什么是强化学习 1 2 强化学习的环境 1 3 强化学习的目标 1 4 强化学习的数据 1 5 强化学习的特征 1 1 什么是强化学习 在机器学习领域 有一类重要的任务和人生选择很相似 即序贯决策 sequential 任

随机推荐

  • C++ win32编程 02 常见消息

    02 常见消息 1 打印消息相关信息 1 1 将消息内容转化为字符串 第一步 定义字符串变量 用来保存转化后的消息 wchar t szInfo 300 定义消息内容变量 第二步 用宽字符格式化函数转化消息内容 wsprintf szInf
  • Ethereum开发

    Ethereum开发 1 简介 1 下载源码 使用Git Bath git clone https github com ethereum go ethereum git 或者使用浏览器下载 2 下载安装包 根据您的系统选择下载 2 官方网
  • Pytorch+LSTM+Encoder+Decoder实现Seq2Seq模型

    usr bin env Python3 coding utf 8 version v1 0 Author Meng Li contact 925762221 qq com FILE torch seq2seq py Time 2022 6
  • sys中stdin与stdout

    如果需要更好的控制输出 而print不能满足需求 sys stdout sys stdin sys stderr就是你需要的 sys stdout与print 在python中调用print时 事实上调用了sys stdout write
  • 特征工程专题

    特征工程 Feature Engineering中文版 特征学习笔记 Fire 特征选择 缺失值处理 数据预处理 林逸飞
  • 嵌入式毕设分享100例(一)

    单片机毕业设计项目分享系列 这里是DD学长 单片机毕业设计及享100例系列的第一篇 目的是分享高质量的毕设作品给大家 包含全面内容 源码 原理图 PCB 实物演示 论文 这两年开始毕业设计和毕业答辩的要求和难度不断提升 传统的单片机项目缺少
  • ggplot2 画线性回归图

    本介绍如何使用R 可视化库 ggplot2 画拟合的线性回归模型 语法 ggplot data aes x y geom point geom smooth method lm 语法基本格式 其中还包括一些参数后面示例会涉及 1 简单示例
  • 总结:JDK源码

    一 JDK源码下载 地址 http jdk java net java se ri 8 选择版本 下载 RI Source Code 代码路径在 openjdk jdk src windows native 对应着java中的类名 如 jd
  • 200立方发酵罐图纸(总图)【年产600吨青霉素钠盐发酵车间工艺设计】

    200立方发酵罐图纸 发酵 原来指的是轻度发泡或沸腾状态 发酵现象早已被人们所认识 但了解它的本质却是近200年来的事 英语中发酵一词fermentation是从拉丁语fervere派生而来的 原意为 翻腾 它描述酵母作用于果汁或麦芽浸出液
  • VS2022解决方案及项目重命名

    问题 项目写完了才发现当时解决方案及项目的名字起的太狭窄了 就想着换个名字 注意下面的图片 都是已经名字改完的了 因为博客是后写的 名字换完了 产生了两个问题 问题一 文件冲突警告 警告MSB8028 中间目录 Debug 包含从另一个项目
  • 虚拟机无法上网原因合集

    普通原因 1 检查ip地址是否正确 root devin ip a 1 lo
  • 大数据用户画像实战之业务数据调研及ETL

    整个用户画像 UserProfile 项目中 数据 业务及技术流程图如下所示 其中数据源存储在业务系统数据库 MySQL 数据库中 采用SQOOP全量 增量将数据抽取到 HDFS Hive表中 通过转换为HFile文件加载到HBase表 1
  • 主线程中捕获子线程异常

    需求 主线程独立执行 无需等待子线程执行完毕 子线程如有异常抛出可自行catch 网上介绍的方法一般是 1 在线程内部进行try catch捕获异常 2 通过线程池的submit方法 获取Future对象 然后try catch Futur
  • rz 传输错误问题 的几种解决方案

    在使用rz传输文件的时候 会遇到传输错误的问题 如下图 情况1 目录不对 一般情况下 切换到 tmp 目录 先将文件传输到 tmp 下 之后再复制到目标位置 情况2 硬盘空间不足 segmentation fault 使用df h查看磁盘空
  • go语言开发环境的搭建-安装和配置SDK

    一 基本介绍 1 SDK全称 software development kit 软件开发工具包 2 SDK是提供给开发人员使用的 其中包含了对应的开发语言的工具包 运行的工具 开发的工具 以及开发所需要的api 这是把我们的源代码编译成二进
  • 记mysql-connector-java:8.0.28的bug排查,你可能也踩坑了

    前言 如标题 最终查明问题是因为 mysql connector java 8 0 28 的一个 bug 导致的 但是在真相未浮出之前 整个问题可谓扑朔迷离 博主好久没有排查过如此得劲的 bug 随着一层层的 debug 深入 真相也随之浮
  • PCB布线线宽和过孔孔径设置为多少合适?

    作者 李大闯 2017 08 19 22 16 对于很多新入行的人来说 不清楚PCB的线宽应该设置为多少 这里作一下解释 对于PCB布线线宽的设置 主要要考虑两个问题 一是流过的电流大小 比如对于电源线来说 需要考虑电路工作时流过的电流 如
  • ios开发App的图标背景色不能是透明

    在ios开发中 App的图标背景不能是透明的 否则打包出来以后 在界面上的显示会是一个带有把黑色背景的图标 换成白色背景后
  • C++ 解析Json——jsoncpp

    C 解析Json
  • SKU 模块丨前端uniapp微信小程序项目

    小兔鲜儿 SKU 模块 学会使用插件市场 下载并使用 SKU 组件 实现商品详情页规格展示和交互 存货单位 SKU SKU 概念 存货单位 Stock Keeping Unit 库存管理的最小可用单元 通常称为 单品 SKU 常见于电商领域