vk-data-goods-sku-popup uniapp vue3示例

效果图

组件简介

vk-data-goods-sku-popup是一个uniapp上面方便好用的sku组件,使用场景包括但不限于商品详情页、购物车页面、订单结算页、搜索结果页

下面就上代码了,完整vue页面的代码如下

<script setup>
import {ref,defineEmits,defineProps,computed} from 'vue'

// 显示toast
const showToast = ({ title, icon, duration }) => {
  uni.showToast({
    title: title || '提示',
    icon: icon || 'none',
    duration: duration || 2000
  });
}

const props = defineProps({
  goodsInfo: {
    type: Object,
    default: () => {
      return {};
    }
  }
});

// 定义事件
const emits = defineEmits(['selectOk']);
// 弹窗状态
const skuPopIsShow = ref(false);
// 弹窗实例
const skuPopupRef = ref();
// 商品数据
const localdata = ref({
  "_id":"002",
  "name": "迪奥香水",
  "goods_thumb":"https://res.lancome.com.cn/resources/2020/9/11/15998112890781924_920X920.jpg?version=20200917220352530",
  "sku_list": [
    {
      "_id": "004",
      "goods_id": "002",
      "goods_name": "迪奥香水",
      "image": "https://res.lancome.com.cn/resources/2020/9/11/15998112890781924_920X920.jpg?version=20200917220352530",
      "price": 19800,
      "sku_name_arr": ["50ml/瓶"],
      "stock": 100
    },
    {
      "_id": "005",
      "goods_id": "002",
      "goods_name": "迪奥香水",
      "image": "https://res.lancome.com.cn/resources/2020/9/11/15998112890781924_920X920.jpg?version=20200917220352530",
      "price": 9800,
      "sku_name_arr": ["70ml/瓶"],
      "stock": 100
    }
  ],
  "spec_list": [
    {
      "list": [
        {
          "name": "20ml/瓶"
        },
        {
          "name": "50ml/瓶"
        },
        {
          "name": "70ml/瓶"
        }
      ],
      "name": "规格"
    }
  ]
});

// pop显示的数据
const skuData = computed(() => {
  if (!props.goodsInfo?.id) {
    return localdata;
  }
  return props.goodsInfo;
});
// 弹窗模式
const skuPopupMode = computed(() => {
  // 先判断缺货

  // 再判断商品类型
  return props.goodsInfo?.goods_type === 1 ? 1 : 3;
});
// 弹窗显示
const showSkuPopup = () => {
  skuPopIsShow.value = true;
};
// 获取商品详情数据
const getGoodsInfoData = async (goodsId) => {
  const res = {
    goods:[]
  }
  console.log('getGoodsInfoData res', res);
  localdata.value = res.goods;

  console.log('getGoodsInfoData skuData', skuData.value);
};
// 弹窗显示并获取商品详情数据
const showSkuPopupAndGetData = async (goodsId) => {
  console.log('showSkuPopupAndGetData', goodsId);
  await getGoodsInfoData(goodsId);
  skuPopIsShow.value = true;
};
// 关闭弹窗
const selectOk = (obj) => {
  emits('selectOk', obj);
};
// 加入购物车
const addCart = async (obj) => {
  console.log('监听 - 加入购物车', obj);
  uni.showLoading({});
  // TODO 调用API,加入购物车
  skuPopIsShow.value = false;
  if (err) {
    console.log(err);
    showToast({
      title: err.message,
      icon: 'none'
    });
    return;
  }
  showToast({
    title: '加入购物车成功',
    icon: 'success'
  });
};
// 立即购买
const buyNow = (obj) => {
  console.log('监听 - 立即购买', obj);
  skuPopIsShow.value = false;
  // TODO 路由到预下单页
};
</script>

<template>
  <button @click="showSkuPopup">显示popup</button>
  <vk-data-goods-sku-popup
      ref="skuPopupRef"
      v-model="skuPopIsShow"
      border-radius="20"
      :localdata="skuData"
      :mode="skuPopupMode"
      goods-thumb-name="cover"
      goods-id-name="id"
      sku-id-name="option_id"
      add-cart-background-color="rgba(255, 96, 0, 0.5)"
      @add-cart="addCart"
      @buy-now="buyNow"
      @selectOk="selectOk"
  ></vk-data-goods-sku-popup>
</template>

<style scoped lang="scss"></style>

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值