fa-skus.vue 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236
  1. <template>
  2. <view>
  3. <u-popup v-model="value" :popup="false" mode="bottom" :height="height(800, 430)" @close="close" :closeable="true" border-radius="20">
  4. <view class="add-carts">
  5. <view class="header u-flex">
  6. <image :src="goods.image || goodsInfo.image" mode="aspectFill"></image>
  7. <view class="u-p-l-30 right">
  8. <view class="">
  9. <text class="price u-font-36">¥{{ goods.price || goodsInfo.price }}</text>
  10. <text class="u-m-l-30 u-tips-color">销量 {{ goods.sales == undefined ? goodsInfo.sales:goods.sales }}</text>
  11. </view>
  12. <view class="u-flex u-flex-wrap">
  13. <text class="u-m-r-15 u-tips-color">已选:</text>
  14. <text>{{ skuArrtext }}</text>
  15. <text>{{ nums }}件</text>
  16. </view>
  17. </view>
  18. </view>
  19. <view class="u-p-t-20 u-p-b-10">
  20. <scroll-view scroll-y="true" class="scroll-Y" :style="{ height: height(500, 130) + 'rpx' }">
  21. <view class="content">
  22. <block v-for="(item, index) in skuSpec" :key="index">
  23. <view class="u-p-t-20 u-p-b-30 text-weight">{{ item.title }}</view>
  24. <view class="u-flex u-flex-wrap">
  25. <view class="item u-m-b-20" v-for="(res, key) in item.sku_value" :key="key">
  26. <u-button size="mini" shape="circle" hover-class="none" :type="res.id == goods_sku_ids[index] ? 'error' : 'default'" :plain="!(res.id == goods_sku_ids[index])" throttle-time="0" :custom-style="customStyle(res.id == goods_sku_ids[index])" @click="cutSku(res, index)" :disabled="res.is_disabled">
  27. {{ res.title }}
  28. </u-button>
  29. </view>
  30. </view>
  31. </block>
  32. <view class="u-p-t-20 u-p-b-30 u-flex u-row-between">
  33. <text class="text-weight">数量</text>
  34. <u-number-box v-model="nums" :min="1" @blur="setCartNum" @minus="setCartNum" @plus="setCartNum"></u-number-box>
  35. </view>
  36. </view>
  37. </scroll-view>
  38. </view>
  39. <view class="u-flex u-row-center u-flex-1" v-if="sceneval>0">
  40. <view class="">
  41. <u-button size="medium" hover-class="none" :custom-style="{ width: '85vw', backgroundColor: theme.bgColor, color: theme.color }" shape="circle" @click="addCart(false)" throttle-time="0">
  42. 确定
  43. </u-button>
  44. </view>
  45. </view>
  46. <view class="u-flex u-row-between u-flex-1" v-else>
  47. <view class="">
  48. <u-button size="medium" hover-class="none" :custom-style="{ width: '45vw', backgroundColor: '#ffba0d', color: theme.color }" shape="circle" @click="addCart(1)">
  49. 加入购物车
  50. </u-button>
  51. </view>
  52. <view class="">
  53. <u-button size="medium" hover-class="none" :custom-style="{ width: '45vw', backgroundColor: theme.bgColor, color: theme.color }" shape="circle" @click="addCart(2)">
  54. 立即购买
  55. </u-button>
  56. </view>
  57. </view>
  58. </view>
  59. </u-popup>
  60. </view>
  61. </template>
  62. <script>
  63. export default {
  64. name: 'fa-carts',
  65. props: {
  66. value: {
  67. type: Boolean,
  68. default: false
  69. },
  70. goodsInfo: {
  71. type: Object,
  72. default () {
  73. return {};
  74. }
  75. },
  76. sceneval: {
  77. type: Number,
  78. default: 1
  79. }
  80. },
  81. computed: {
  82. skuArrtext() {
  83. let newArr = this.goods_sku_text.filter(i => i && i.trim());
  84. if (newArr.length > 0) {
  85. return newArr.join(',') + ',';
  86. }
  87. return '';
  88. },
  89. customStyle() {
  90. return status => {
  91. let style = { padding: '28rpx 40rpx' };
  92. if (status) {
  93. style.backgroundColor = this.theme.bgColor;
  94. style.color = this.theme.color;
  95. }
  96. return style;
  97. };
  98. },
  99. height() {
  100. return (a, b) => {
  101. return (this.skuSpec.length > 0 ? a : b) + '';
  102. };
  103. }
  104. },
  105. watch: {
  106. goods_sku_ids: {
  107. handler(val) {
  108. //都选择了
  109. if (val.length == this.skuSpec.length) {
  110. this.goods = this.sku[JSON.parse(JSON.stringify(val)).sort()] || {};
  111. }
  112. },
  113. deep: true
  114. }
  115. },
  116. data() {
  117. return {
  118. show: true,
  119. skuSpec: [],
  120. sku: [],
  121. goods_sku_ids: [],
  122. goods_sku_text: [],
  123. goods: {},
  124. nums: 1
  125. };
  126. },
  127. created() {
  128. this.skuSpec = this.goodsInfo.sku_spec;
  129. let skus = [];
  130. this.goodsInfo.sku.forEach(item => {
  131. let ids = item.sku_id.split(',').sort();
  132. skus[ids] = item;
  133. });
  134. this.sku = skus;
  135. this.changeItems();
  136. },
  137. methods: {
  138. close() {
  139. this.$emit('input', false);
  140. },
  141. cutSku(item, index) {
  142. if (this.goods_sku_ids[index] != undefined && this.goods_sku_ids[index] == item.id) {
  143. this.$set(this.goods_sku_ids, index, ''); //储存id
  144. this.$set(this.goods_sku_text, index, '');
  145. } else {
  146. this.$set(this.goods_sku_ids, index, item.id); //储存id
  147. this.$set(this.goods_sku_text, index, item.title); //储存名称
  148. }
  149. this.changeItems();
  150. },
  151. changeItems() {
  152. let result = []; //定义数组存储被选中的值
  153. this.skuSpec.forEach((item, index) => {
  154. result[index] = this.goods_sku_ids[index] ? this.goods_sku_ids[index] : '';
  155. });
  156. for (let [index, item] of this.skuSpec.entries()) {
  157. let last = result[index];
  158. for (let i in item.sku_value) {
  159. result[index] = item.sku_value[i].id;
  160. this.$set(this.skuSpec[index].sku_value[i], 'is_disabled', !this.isDisabled(result));
  161. }
  162. result[index] = last;
  163. }
  164. },
  165. //判断禁用
  166. isDisabled(result) {
  167. for (let i in result) {
  168. if (result[i] == '') {
  169. return true; //如果数组里有为空的值,那直接返回true
  170. }
  171. }
  172. //避免结果被修改
  173. let res = JSON.parse(JSON.stringify(result));
  174. return this.sku[res.sort()] && this.sku[res.sort()].stocks > 0;
  175. },
  176. setCartNum() {},
  177. //加入购物车
  178. addCart(sceneval) {
  179. if (!sceneval && this.goods_sku_text.length < this.skuSpec.length) {
  180. this.$u.toast('请选择商品规格')
  181. return;
  182. }
  183. //立即购买,加入购物车,即提交订单
  184. sceneval = sceneval || this.sceneval;
  185. this.$api
  186. .addCart({
  187. goods_id: this.goodsInfo.id,
  188. nums: this.nums,
  189. goods_sku_id: this.goods.id || '',
  190. sceneval: sceneval
  191. })
  192. .then(res => {
  193. this.$u.toast(res.msg);
  194. this.$emit('input', false);
  195. if (res.code == 1 && sceneval == 2) {
  196. //立即购买,
  197. this.goPage('/pages/goods/order?id=' + res.data + '&sceneval=' + sceneval);
  198. } else {
  199. this.$emit('success');
  200. }
  201. });
  202. }
  203. }
  204. };
  205. </script>
  206. <style lang="scss" scoped>
  207. .add-carts {
  208. padding: 30rpx 30rpx 0;
  209. .content {
  210. display: flex;
  211. flex-direction: column;
  212. .item {
  213. margin-right: 15rpx;
  214. }
  215. }
  216. }
  217. .header {
  218. image {
  219. width: 200rpx;
  220. height: 150rpx;
  221. border-radius: 10rpx;
  222. }
  223. .right {
  224. height: 120rpx;
  225. display: flex;
  226. flex-direction: column;
  227. justify-content: space-between;
  228. }
  229. }
  230. </style>