SKU 商品多规格选择器
该组件是一款仿京东算法的轻量化、强大、拓展性强、可使用带图sku、可根据配置主题色自动生成相应的组件主题色的商品多规格sku,仅需要按照指定格式传入sku数组便可以直接使用。
平台兼容性
| App(vue) | App(nvue) | H5 | 小程序 | VUE2 | VUE3 |
|---|---|---|---|---|---|
| √ | √ | √ | √ | √ | √ |
依赖
在使用前组件前,需要先安装依赖 crypto-js ,以此来生成加密的属性名。
shell
npm install crypto-jsnpm install crypto-js基本使用
vue
<template>
<view class="test" style="padding: 3rem 1.5rem;">
<wu-sku v-model="skuShow" :data="skus" :themeColor="[226, 35, 26]"
defaultCover="https://mp-16389c52-85e7-413f-b566-3da08e2fe054.cdn.bspapp.com/img/sku-test/default.jpeg"
btnConfirmText="购买" notSelectSku="请选择完整的商品信息" @skuChange="skuChange" @confirm="skuConfirm"></wu-sku>
<!-- 打开sku组件 -->
<button @click="skuShow = true">打开sku组件</button>
</view>
</template>
<script setup>
import {
ref,
reactive,
inject,
toRefs
} from "vue";
import {} from '@dcloudio/uni-app';
let skuShow = ref(false);
// sku列表
let skus = ref([{
id: 1,
price: 7000,
stock: 30,
sku_attrs: {
'机身颜色': '深空黑色',
'储存容量': '128G',
'套装': '快充套装'
}
},
{
id: 2,
price: 8500,
stock: 10,
sku_attrs: {
'机身颜色': '暗紫色',
'储存容量': '256G',
'套装': '快充套装'
}
},
{
id: 3,
price: 9500,
stock: 0,
sku_attrs: {
'机身颜色': '暗紫色',
'储存容量': '512G',
'套装': 'AirPods套装'
}
},
{
id: 4,
price: 9200,
stock: 60,
sku_attrs: {
'机身颜色': '银色',
'储存容量': '512G',
'套装': 'AirPods套装'
}
},
{
id: 5,
price: 9200,
stock: 80,
sku_attrs: {
'机身颜色': '金色',
'储存容量': '512G',
'套装': 'AirPods3套装'
}
}
])
// sku发生改变事件, 选择完整的sku则回返回 否则sku的值为{}
let skuChange = (sku) => {
console.log(sku);
}
// sku确认事件
let skuConfirm = (e) => {
console.log(e);
}
</script><template>
<view class="test" style="padding: 3rem 1.5rem;">
<wu-sku v-model="skuShow" :data="skus" :themeColor="[226, 35, 26]"
defaultCover="https://mp-16389c52-85e7-413f-b566-3da08e2fe054.cdn.bspapp.com/img/sku-test/default.jpeg"
btnConfirmText="购买" notSelectSku="请选择完整的商品信息" @skuChange="skuChange" @confirm="skuConfirm"></wu-sku>
<!-- 打开sku组件 -->
<button @click="skuShow = true">打开sku组件</button>
</view>
</template>
<script setup>
import {
ref,
reactive,
inject,
toRefs
} from "vue";
import {} from '@dcloudio/uni-app';
let skuShow = ref(false);
// sku列表
let skus = ref([{
id: 1,
price: 7000,
stock: 30,
sku_attrs: {
'机身颜色': '深空黑色',
'储存容量': '128G',
'套装': '快充套装'
}
},
{
id: 2,
price: 8500,
stock: 10,
sku_attrs: {
'机身颜色': '暗紫色',
'储存容量': '256G',
'套装': '快充套装'
}
},
{
id: 3,
price: 9500,
stock: 0,
sku_attrs: {
'机身颜色': '暗紫色',
'储存容量': '512G',
'套装': 'AirPods套装'
}
},
{
id: 4,
price: 9200,
stock: 60,
sku_attrs: {
'机身颜色': '银色',
'储存容量': '512G',
'套装': 'AirPods套装'
}
},
{
id: 5,
price: 9200,
stock: 80,
sku_attrs: {
'机身颜色': '金色',
'储存容量': '512G',
'套装': 'AirPods3套装'
}
}
])
// sku发生改变事件, 选择完整的sku则回返回 否则sku的值为{}
let skuChange = (sku) => {
console.log(sku);
}
// sku确认事件
let skuConfirm = (e) => {
console.log(e);
}
</script>vue
<template>
<view class="test" style="padding: 3rem 1.5rem;">
<wu-sku
v-model="skuShow"
:data="skus"
:themeColor="[226, 35, 26]"
defaultCover="https://mp-16389c52-85e7-413f-b566-3da08e2fe054.cdn.bspapp.com/img/sku-test/default.jpeg"
btnConfirmText="购买" notSelectSku="请选择完整的商品信息"
@skuChange="skuChange"
@confirm="skuConfirm"
></wu-sku>
<!-- 打开sku组件 -->
<button @click="skuShow = true">打开sku组件</button>
</view>
</template>
<script>
export default {
data() {
return {
// 是否显示组件
skuShow: false,
// sku列表
skus: [{
id: 1,
price: 7000,
stock: 30,
sku_attrs: {
'机身颜色': '深空黑色',
'储存容量': '128G',
'套装': '快充套装'
}
},
{
id: 2,
price: 8500,
stock: 10,
sku_attrs: {
'机身颜色': '暗紫色',
'储存容量': '256G',
'套装': '快充套装'
}
},
{
id: 3,
price: 9500,
stock: 0,
sku_attrs: {
'机身颜色': '暗紫色',
'储存容量': '512G',
'套装': 'AirPods套装'
}
},
{
id: 4,
price: 9200,
stock: 60,
sku_attrs: {
'机身颜色': '银色',
'储存容量': '512G',
'套装': 'AirPods套装'
}
},
{
id: 5,
price: 9200,
stock: 80,
sku_attrs: {
'机身颜色': '金色',
'储存容量': '512G',
'套装': 'AirPods3套装'
}
}
]
}
},
methods: {
// sku发生改变事件, 选择完整的sku则回返回 否则sku的值为{}
skuChange(sku) {
console.log(sku);
},
// sku确认事件
skuConfirm(e) {
console.log(e);
}
}
}
</script><template>
<view class="test" style="padding: 3rem 1.5rem;">
<wu-sku
v-model="skuShow"
:data="skus"
:themeColor="[226, 35, 26]"
defaultCover="https://mp-16389c52-85e7-413f-b566-3da08e2fe054.cdn.bspapp.com/img/sku-test/default.jpeg"
btnConfirmText="购买" notSelectSku="请选择完整的商品信息"
@skuChange="skuChange"
@confirm="skuConfirm"
></wu-sku>
<!-- 打开sku组件 -->
<button @click="skuShow = true">打开sku组件</button>
</view>
</template>
<script>
export default {
data() {
return {
// 是否显示组件
skuShow: false,
// sku列表
skus: [{
id: 1,
price: 7000,
stock: 30,
sku_attrs: {
'机身颜色': '深空黑色',
'储存容量': '128G',
'套装': '快充套装'
}
},
{
id: 2,
price: 8500,
stock: 10,
sku_attrs: {
'机身颜色': '暗紫色',
'储存容量': '256G',
'套装': '快充套装'
}
},
{
id: 3,
price: 9500,
stock: 0,
sku_attrs: {
'机身颜色': '暗紫色',
'储存容量': '512G',
'套装': 'AirPods套装'
}
},
{
id: 4,
price: 9200,
stock: 60,
sku_attrs: {
'机身颜色': '银色',
'储存容量': '512G',
'套装': 'AirPods套装'
}
},
{
id: 5,
price: 9200,
stock: 80,
sku_attrs: {
'机身颜色': '金色',
'储存容量': '512G',
'套装': 'AirPods3套装'
}
}
]
}
},
methods: {
// sku发生改变事件, 选择完整的sku则回返回 否则sku的值为{}
skuChange(sku) {
console.log(sku);
},
// sku确认事件
skuConfirm(e) {
console.log(e);
}
}
}
</script>单独logo设置(在不使用带图sku时生效)
每组 sku 属性都可以单独设置 logo 属性,logo 属性会在选择完整 sku 后展示,未选择完整 sku时会展示 组件的 defaultCover 属性
js
[
...
{
id: 5,
price: 9200,
logo: '图片路径',
stock: 80,
sku_attrs: {
'机身颜色': '金色',
'储存容量': '512G',
}
}
...
][
...
{
id: 5,
price: 9200,
logo: '图片路径',
stock: 80,
sku_attrs: {
'机身颜色': '金色',
'储存容量': '512G',
}
}
...
]带图sku
如果您想某个 sku 的属性带有图片展示时,只需要在您想展示图片的 sku 属性上,将原有的 属性名:属性值 变成 属性名: {name: 属性名, img: '图片链接'} 即可。
例如: 我们想让 机身颜色 的这个属性带有图片展示时。
js
// 以下代码可以直接复制使用
[
{
id: 1,
price: 7000,
stock: 30,
sku_attrs: {
'机身颜色': {
name: '深空黑色',
img: 'https://mp-16389c52-85e7-413f-b566-3da08e2fe054.cdn.bspapp.com/img/sku-test/heise.jpeg',
},
'储存容量': '128G',
'套装': '快充套装'
}
},
{
id: 2,
price: 8500,
stock: 10,
sku_attrs: {
'机身颜色': {
name: '暗紫色',
img: 'https://mp-16389c52-85e7-413f-b566-3da08e2fe054.cdn.bspapp.com/img/sku-test/anyezi.jpeg',
},
'储存容量': '256G',
'套装': '快充套装'
}
},
{
id: 3,
price: 9500,
stock: 0,
sku_attrs: {
'机身颜色': {
name: '暗紫色',
img: 'https://mp-16389c52-85e7-413f-b566-3da08e2fe054.cdn.bspapp.com/img/sku-test/anyezi.jpeg',
},
'储存容量': '512G',
'套装': 'AirPods套装'
}
},
{
id: 4,
price: 9200,
stock: 60,
sku_attrs: {
'机身颜色': {
name: '银色',
img: 'https://mp-16389c52-85e7-413f-b566-3da08e2fe054.cdn.bspapp.com/img/sku-test/baise.jpeg',
},
'储存容量': '512G',
'套装': 'AirPods套装'
}
},
{
id: 5,
price: 9200,
stock: 80,
sku_attrs: {
'机身颜色': {
name: '金色',
img: 'https://mp-16389c52-85e7-413f-b566-3da08e2fe054.cdn.bspapp.com/img/sku-test/jinse.jpeg',
},
'储存容量': '512G',
'套装': 'AirPods3套装'
}
}
]// 以下代码可以直接复制使用
[
{
id: 1,
price: 7000,
stock: 30,
sku_attrs: {
'机身颜色': {
name: '深空黑色',
img: 'https://mp-16389c52-85e7-413f-b566-3da08e2fe054.cdn.bspapp.com/img/sku-test/heise.jpeg',
},
'储存容量': '128G',
'套装': '快充套装'
}
},
{
id: 2,
price: 8500,
stock: 10,
sku_attrs: {
'机身颜色': {
name: '暗紫色',
img: 'https://mp-16389c52-85e7-413f-b566-3da08e2fe054.cdn.bspapp.com/img/sku-test/anyezi.jpeg',
},
'储存容量': '256G',
'套装': '快充套装'
}
},
{
id: 3,
price: 9500,
stock: 0,
sku_attrs: {
'机身颜色': {
name: '暗紫色',
img: 'https://mp-16389c52-85e7-413f-b566-3da08e2fe054.cdn.bspapp.com/img/sku-test/anyezi.jpeg',
},
'储存容量': '512G',
'套装': 'AirPods套装'
}
},
{
id: 4,
price: 9200,
stock: 60,
sku_attrs: {
'机身颜色': {
name: '银色',
img: 'https://mp-16389c52-85e7-413f-b566-3da08e2fe054.cdn.bspapp.com/img/sku-test/baise.jpeg',
},
'储存容量': '512G',
'套装': 'AirPods套装'
}
},
{
id: 5,
price: 9200,
stock: 80,
sku_attrs: {
'机身颜色': {
name: '金色',
img: 'https://mp-16389c52-85e7-413f-b566-3da08e2fe054.cdn.bspapp.com/img/sku-test/jinse.jpeg',
},
'储存容量': '512G',
'套装': 'AirPods3套装'
}
}
]js
[
{
id: 1,
price: 7000,
stock: 30,
sku_attrs: {
'机身颜色': '深空黑色',
'储存容量': '128G',
'套装': '快充套装'
}
},
{
id: 2,
price: 8500,
stock: 10,
sku_attrs: {
'机身颜色': '暗紫色',
'储存容量': '256G',
'套装': '快充套装'
}
},
{
id: 3,
price: 9500,
stock: 0,
sku_attrs: {
'机身颜色': '暗紫色',
'储存容量': '512G',
'套装': 'AirPods套装'
}
},
{
id: 4,
price: 9200,
stock: 60,
sku_attrs: {
'机身颜色': '银色',
'储存容量': '512G',
'套装': 'AirPods套装'
}
},
{
id: 5,
price: 9200,
stock: 80,
sku_attrs: {
'机身颜色': '金色',
'储存容量': '512G',
'套装': 'AirPods3套装'
}
}
][
{
id: 1,
price: 7000,
stock: 30,
sku_attrs: {
'机身颜色': '深空黑色',
'储存容量': '128G',
'套装': '快充套装'
}
},
{
id: 2,
price: 8500,
stock: 10,
sku_attrs: {
'机身颜色': '暗紫色',
'储存容量': '256G',
'套装': '快充套装'
}
},
{
id: 3,
price: 9500,
stock: 0,
sku_attrs: {
'机身颜色': '暗紫色',
'储存容量': '512G',
'套装': 'AirPods套装'
}
},
{
id: 4,
price: 9200,
stock: 60,
sku_attrs: {
'机身颜色': '银色',
'储存容量': '512G',
'套装': 'AirPods套装'
}
},
{
id: 5,
price: 9200,
stock: 80,
sku_attrs: {
'机身颜色': '金色',
'储存容量': '512G',
'套装': 'AirPods3套装'
}
}
]指定默认选中sku
selectSkuIndex 用来指定默认要选中的sku下标。
vue
<wu-sku
v-model="skuShow"
:data="skus"
defaultCover="http://rn8zfvrr0.hn-bkt.clouddn.com/e40744e32a2930f945e67da79a35f270.jpg?e=1672666137&token=0qmhoqQQZ4ggfGZOevcNXE4wYe_IZD3Y5xm8ZZ5Y:bxn-lcJPnFNY22kGWwh5MRgdGwM="
btnConfirmText="购买"
notSelectSku="请选择完整的商品信息"
:isShowStock="false"
:selectSkuIndex="3"
@skuChange="skuChange"
@confirm="skuConfirm"
></wu-sku><wu-sku
v-model="skuShow"
:data="skus"
defaultCover="http://rn8zfvrr0.hn-bkt.clouddn.com/e40744e32a2930f945e67da79a35f270.jpg?e=1672666137&token=0qmhoqQQZ4ggfGZOevcNXE4wYe_IZD3Y5xm8ZZ5Y:bxn-lcJPnFNY22kGWwh5MRgdGwM="
btnConfirmText="购买"
notSelectSku="请选择完整的商品信息"
:isShowStock="false"
:selectSkuIndex="3"
@skuChange="skuChange"
@confirm="skuConfirm"
></wu-sku>不相关sku是否禁用
和目前选中的sku属性不相关的其余sku属性是否禁用。
vue
<wu-sku
v-model="skuShow"
:data="skus"
defaultCover="http://rn8zfvrr0.hn-bkt.clouddn.com/e40744e32a2930f945e67da79a35f270.jpg?e=1672666137&token=0qmhoqQQZ4ggfGZOevcNXE4wYe_IZD3Y5xm8ZZ5Y:bxn-lcJPnFNY22kGWwh5MRgdGwM="
btnConfirmText="购买"
skuUnrelatedDisabled
:skuDisabledStyle="{}"
notSelectSku="请选择完整的商品信息"
:isShowStock="false"
:selectSkuIndex="3"
@skuChange="skuChange"
@confirm="skuConfirm"
></wu-sku><wu-sku
v-model="skuShow"
:data="skus"
defaultCover="http://rn8zfvrr0.hn-bkt.clouddn.com/e40744e32a2930f945e67da79a35f270.jpg?e=1672666137&token=0qmhoqQQZ4ggfGZOevcNXE4wYe_IZD3Y5xm8ZZ5Y:bxn-lcJPnFNY22kGWwh5MRgdGwM="
btnConfirmText="购买"
skuUnrelatedDisabled
:skuDisabledStyle="{}"
notSelectSku="请选择完整的商品信息"
:isShowStock="false"
:selectSkuIndex="3"
@skuChange="skuChange"
@confirm="skuConfirm"
></wu-sku>如果您对sku禁用样式不满意可以通过设置 skuDisabledStyle 来实现样式修改,对象的形式即可。
SKU Props
| 属性名 | 说明 | 类型 | 默认值 | 可选值 |
|---|---|---|---|---|
| data | 源数据(sku列表) | Array | [] | - |
| value/modelValue/v-model | 是否显示sku组件 | Boolean | false | true/false |
| isMaskClose | 是否可以点击遮罩层关闭 | Boolean | false | true/false |
| isSelectMinPriceSku | 是否默认选中最低价格的sku | Boolean | true | true/false |
| selectSkuIndex | 默认选中的sku下标 | Number/String | null | - |
| defaultCover | 默认封面图,用于没有选中完整的sku时展示 | String | "" | - |
| defaultNum | 默认购买商品数量 | Number/String | 1 | - |
| themeColor | 主题色,需要传入一个数组长度为3的数组,分别对应rgb三个颜色的值,例如: [84, 164, 255] | Array | [84, 164, 255] | - |
| btnConfirmText | 确认按钮文字 | String | "确认" | - |
| skuUnrelatedDisabled | 和目前选中的sku属性不相关的其余sku属性是否禁用。 | Boolean | false | true/false |
| skuDisabledStyle | sku禁用样式 | Object | {} | - |
| notStockText | 库存不足文字 | String | "库存不足" | - |
| notSelectSku | 未选择完整的sku时的文字提示 | String | "请选择完整的sku属性" | - |
| showStockNum | 是否展示库存数量 | Boolean | true | true/false |
SKU Events
| 事件名 | 说明 | 回调参数 |
|---|---|---|
| confirm | 点击确认按钮时触发的事件 | e = { sku, skuText , num }。分别对应选中的sku值 、sku属性名数组 、输入框内的数量。 |
| skuChange | sku发生变化时出发的事件,如果有选中完整的sku则会返回该sku,否则会返回{} | e = {} |
| numChange | 输入框内数量发生改变时触发事件 | e = num, 返回输入框数量 |
| close | 关闭sku组件触发事件 | - |
| open | 打开sku组件触发事件 | - |
SKU Methods
| 方法名 | 说明 |
|---|---|
| resetNum | 重置购买数量 |
WU-UI