<template> <goods-sku-popup :modelValue="modelValue" @input="onChangeValue" border-radius="20" :localdata="goodsInfo" :mode="skuMode" :maskCloseAble="true" :priceColor="appTheme.mainBg" :buyNowBackgroundColor="appTheme.mainBg" :addCartColor="appTheme.viceText" :addCartBackgroundColor="appTheme.viceBg" :activedStyle="{ color: appTheme.mainBg, borderColor: appTheme.mainBg, backgroundColor: activedBtnBackgroundColor }" @open="openSkuPopup" @close="closeSkuPopup" @buy-now="buyNow" buyNowText="立即购买" :maxBuyNum="goods.limit_num" :noStockText="noStockText" /> </template> <script> import { hex2rgba } from '@/utils/color' import * as TaskApi from '@/api/bargain/task' import GoodsSkuPopup from '@/components/goods-sku-popup' export default { components: { GoodsSkuPopup }, emits: ['update:modelValue'], props: { // 控制组件显示隐藏 modelValue: { Type: Boolean, default: false }, // 模式 1:都显示 2:只显示购物车 3:只显示立即购买 skuMode: { type: Number, default: 1 }, // 砍价活动详情 active: { type: Object, default: {} }, // 该商品已抢完时的按钮文字 noStockText: { Type: String, default: "该商品已抢完" }, // 商品详情信息 goods: { type: Object, default: {} } }, data() { return { goodsInfo: {} } }, computed: { // 规格按钮选中时的背景色 activedBtnBackgroundColor() { return hex2rgba(this.appTheme.mainBg, 0.1) } }, created() { const app = this const { goods } = app app.goodsInfo = { _id: goods.goods_id, name: goods.goods_name, goods_thumb: goods.goods_image, sku_list: app.getSkuList(), spec_list: app.getSpecList() } }, methods: { // 监听组件显示隐藏 onChangeValue(val) { this.$emit('update:modelValue', val) }, /** * 获取商品信息 * 这里可以看到每次打开SKU都会去重新请求商品信息,为的是每次打开SKU组件可以实时看到剩余库存 */ findGoodsInfo() { return new Promise((resolve, reject) => { resolve(goodsInfo) }) }, // 整理商品SKU列表 getSkuList() { const app = this const { goods: { goods_name, goods_image, skuList } } = app const skuData = [] skuList.forEach(item => { skuData.push({ _id: item.id, goods_sku_id: item.goods_sku_id, goods_id: item.goods_id, goods_name: goods_name, image: item.image_url ? item.image_url : goods_image, price: item.seckill_price * 100, stock: item.seckill_stock, spec_value_ids: item.spec_value_ids, sku_name_arr: app.getSkuNameArr(item.spec_value_ids) }) }) return skuData }, // 获取sku记录的规格值列表 getSkuNameArr(specValueIds) { const app = this const defaultData = ['默认'] const skuNameArr = [] if (specValueIds) { specValueIds.forEach((valueId, groupIndex) => { const specValueName = app.getSpecValueName(valueId, groupIndex) skuNameArr.push(specValueName) }) } return skuNameArr.length ? skuNameArr : defaultData }, // 获取指定的规格值名称 getSpecValueName(valueId, groupIndex) { const app = this const { goods: { specList } } = app const res = specList[groupIndex].valueList.find(specValue => { return specValue.spec_value_id == valueId }) return res.spec_value }, // 整理规格数据 getSpecList() { const { goods: { specList } } = this const defaultData = [{ name: '默认', list: [{ name: '默认' }] }] const specData = [] specList.forEach(group => { const children = [] group.valueList.forEach(specValue => { children.push({ name: specValue.spec_value }) }) specData.push({ name: group.spec_name, list: children }) }) return specData.length ? specData : defaultData }, // sku组件 开始----------------------------------------------------------- openSkuPopup() { // console.log("监听 - 打开sku组件") }, closeSkuPopup() { // console.log("监听 - 关闭sku组件") }, // 立即购买 buyNow(selectShop) { const app = this // 跳转到订单结算页 app.$navTo('pages/checkout/index', { mode: 'sharp', activeTimeId: app.active.active_time_id, sharpGoodsId: app.goods.sharp_goods_id, goodsSkuId: selectShop.goods_sku_id, goodsNum: selectShop.buy_num }) // 隐藏当前弹窗 app.onChangeValue(false) } } } </script> <style lang="scss" scoped> </style>