Skip to content

SKU 商品多规格选择器

该组件是一款仿京东算法的轻量化、强大、拓展性强、可使用带图sku、可根据配置主题色自动生成相应的组件主题色的商品多规格sku,仅需要按照指定格式传入sku数组便可以直接使用。

平台兼容性

App(vue)App(nvue)H5小程序VUE2VUE3

依赖

在使用前组件前,需要先安装依赖 crypto-js ,以此来生成加密的属性名。

shell
npm install crypto-js
npm 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组件Booleanfalsetrue/false
isMaskClose是否可以点击遮罩层关闭Booleanfalsetrue/false
isSelectMinPriceSku是否默认选中最低价格的skuBooleantruetrue/false
selectSkuIndex默认选中的sku下标Number/Stringnull-
defaultCover默认封面图,用于没有选中完整的sku时展示String""-
defaultNum默认购买商品数量Number/String1-
themeColor主题色,需要传入一个数组长度为3的数组,分别对应rgb三个颜色的值,例如: [84, 164, 255]Array[84, 164, 255]-
btnConfirmText确认按钮文字String"确认"-
skuUnrelatedDisabled和目前选中的sku属性不相关的其余sku属性是否禁用。Booleanfalsetrue/false
skuDisabledStylesku禁用样式Object{}-
notStockText库存不足文字String"库存不足"-
notSelectSku未选择完整的sku时的文字提示String"请选择完整的sku属性"-
showStockNum是否展示库存数量Booleantruetrue/false

SKU Events

事件名说明回调参数
confirm点击确认按钮时触发的事件e = { sku, skuText , num }。分别对应选中的sku值 、sku属性名数组 、输入框内的数量。
skuChangesku发生变化时出发的事件,如果有选中完整的sku则会返回该sku,否则会返回{}e = {}
numChange输入框内数量发生改变时触发事件e = num, 返回输入框数量
close关闭sku组件触发事件-
open打开sku组件触发事件-

SKU Methods

方法名说明
resetNum重置购买数量