SkuPopup.vue 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. <template>
  2. <goods-sku-popup :value="value" @input="onChangeValue" border-radius="20" :custom-action="findGoodsInfo"
  3. :mode="skuMode" :defaultPrice="goods.price" :defaultStock="goods.stock" :maskCloseAble="true"
  4. @open="openSkuPopup" @close="closeSkuPopup" @add-cart="addCart" @buy-now="buyNow" />
  5. </template>
  6. <script>
  7. import { setCartTotalNum } from '@/utils/app'
  8. import * as CartApi from '@/api/cart'
  9. import * as GoodsApi from '@/api/goods'
  10. import GoodsSkuPopup from '@/components/goods-sku-popup'
  11. let goodsInfo;
  12. export default {
  13. components: {
  14. GoodsSkuPopup
  15. },
  16. model: {
  17. prop: 'value',
  18. event: 'input'
  19. },
  20. props: {
  21. // true 组件显示 false 组件隐藏
  22. value: {
  23. Type: Boolean,
  24. default: false
  25. },
  26. // 模式 1:都显示 2:只显示购物车 3:只显示立即购买
  27. skuMode: {
  28. type: Number,
  29. default: 1
  30. },
  31. // 商品详情信息
  32. goods: {
  33. type: Object,
  34. default: {}
  35. }
  36. },
  37. data() {
  38. return {}
  39. },
  40. created() {
  41. const app = this
  42. const { goods } = app
  43. goodsInfo = {
  44. _id: goods.goodsId,
  45. name: goods.name,
  46. goods_thumb: goods.logo,
  47. sku_list: app.getSkuList(),
  48. spec_list: app.getSpecList()
  49. }
  50. },
  51. methods: {
  52. // 监听组件显示隐藏
  53. onChangeValue(val) {
  54. this.$emit('input', val)
  55. },
  56. /**
  57. * 获取商品信息
  58. * 这里可以看到每次打开SKU都会去重新请求商品信息,为的是每次打开SKU组件可以实时看到剩余库存
  59. */
  60. findGoodsInfo() {
  61. return new Promise((resolve, reject) => {
  62. resolve(goodsInfo)
  63. })
  64. },
  65. // 整理商品SKU列表
  66. getSkuList() {
  67. const app = this
  68. const { goods: { name, logo, skuList } } = app
  69. const skuData = []
  70. if (skuList) {
  71. skuList.forEach(item => {
  72. skuData.push({
  73. _id: item.id,
  74. sku_id: item.skuId,
  75. goods_id: item.goodsId,
  76. name: name,
  77. image: item.logo ? item.logo : logo,
  78. price: item.price,
  79. stock: item.stock,
  80. spec_value_ids: item.specIds,
  81. sku_name_arr: app.getSkuNameArr(item.specIds)
  82. })
  83. })
  84. }
  85. return skuData
  86. },
  87. // 获取sku记录的规格值列表
  88. getSkuNameArr(specValueIds) {
  89. const app = this
  90. const defaultData = ['默认']
  91. const skuNameArr = []
  92. if (specValueIds) {
  93. specValueIds.forEach((valueId, specId) => {
  94. const specValueName = app.getSpecValueName(valueId, specId)
  95. skuNameArr.push(specValueName)
  96. })
  97. }
  98. return skuNameArr.length ? skuNameArr : defaultData
  99. },
  100. // 获取指定的规格值名称
  101. getSpecValueName(valueId, specId) {
  102. const app = this
  103. const { goods: { specList } } = app
  104. const res = specList[specId].valueList.find(specValue => {
  105. return specValue.specValueId == valueId
  106. })
  107. if (res) {
  108. return res.specValue
  109. } else {
  110. return ""
  111. }
  112. },
  113. // 整理规格数据
  114. getSpecList() {
  115. const { goods: { specList } } = this
  116. const defaultData = [{ name: '默认', list: [{ name: '默认' }] }]
  117. const specData = []
  118. if (specList) {
  119. specList.forEach(group => {
  120. const children = []
  121. group.valueList.forEach(specValue => {
  122. children.push({ name: specValue.specValue })
  123. })
  124. specData.push({
  125. name: group.name,
  126. list: children
  127. })
  128. })
  129. }
  130. return specData.length ? specData : defaultData
  131. },
  132. // sku组件 开始-----------------------------------------------------------
  133. openSkuPopup() {
  134. // console.log("监听 - 打开sku组件")
  135. },
  136. closeSkuPopup() {
  137. // console.log("监听 - 关闭sku组件")
  138. },
  139. // 加入购物车按钮
  140. addCart(selectShop) {
  141. const app = this
  142. console.log(selectShop)
  143. const { goods_id, sku_id, buy_num } = selectShop
  144. CartApi.save(goods_id, '+', sku_id, buy_num)
  145. .then(result => {
  146. // 隐藏当前弹窗
  147. app.onChangeValue(false);
  148. // 购物车商品总数量
  149. const cartTotal = result.data ? result.data.cartTotal : 0;
  150. // 缓存购物车数量
  151. setCartTotalNum(cartTotal);
  152. // 传递给父级
  153. app.$emit('addCart', cartTotal);
  154. })
  155. },
  156. // 立即购买
  157. buyNow(selectShop) {
  158. // 跳转到订单结算页
  159. this.$navTo('pages/settlement/goods', {
  160. mode: 'buyNow',
  161. goodsId: selectShop.goods_id,
  162. skuId: selectShop.sku_id,
  163. buyNum: selectShop.buy_num
  164. })
  165. // 隐藏当前弹窗
  166. this.onChangeValue(false)
  167. }
  168. }
  169. }
  170. </script>
  171. <style lang="scss" scoped>
  172. </style>