index.vue 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231
  1. <template>
  2. <demo-section>
  3. <!-- 基础用法 -->
  4. <demo-block :title="$t('basicUsage')">
  5. <div class="sku-container">
  6. <van-sku
  7. v-model="showBase"
  8. :sku="skuData.sku"
  9. :goods="skuData.goods_info"
  10. :goods-id="skuData.goods_id"
  11. :hide-stock="skuData.sku.hide_stock"
  12. :quota="skuData.quota"
  13. :quota-used="skuData.quota_used"
  14. reset-stepper-on-hide
  15. reset-selected-sku-on-hide
  16. disable-stepper-input
  17. :close-on-click-overlay="closeOnClickOverlay"
  18. :message-config="messageConfig"
  19. :custom-sku-validator="customSkuValidator"
  20. @buy-clicked="onBuyClicked"
  21. @add-cart="onAddCartClicked"
  22. />
  23. <van-button
  24. block
  25. type="primary"
  26. @click="showBase = true"
  27. >
  28. {{ $t('basicUsage') }}
  29. </van-button>
  30. </div>
  31. </demo-block>
  32. <!-- 自定义步进器 -->
  33. <demo-block :title="$t('title2')">
  34. <div class="sku-container">
  35. <van-sku
  36. hide-quota-text
  37. v-model="showStepper"
  38. :sku="skuData.sku"
  39. :goods="skuData.goods_info"
  40. :goods-id="skuData.goods_id"
  41. :hide-stock="skuData.sku.hide_stock"
  42. :quota="skuData.quota"
  43. :quota-used="skuData.quota_used"
  44. :custom-stepper-config="customStepperConfig"
  45. :message-config="messageConfig"
  46. @buy-clicked="onBuyClicked"
  47. @add-cart="onAddCartClicked"
  48. />
  49. <van-button
  50. block
  51. type="primary"
  52. @click="showStepper = true"
  53. >
  54. {{ $t('title2') }}
  55. </van-button>
  56. </div>
  57. </demo-block>
  58. <!-- 隐藏售罄sku -->
  59. <demo-block :title="$t('hideSoldoutSku')">
  60. <div class="sku-container">
  61. <van-sku
  62. hide-quota-text
  63. v-model="showSoldout"
  64. :sku="skuData.sku"
  65. :goods="skuData.goods_info"
  66. :goods-id="skuData.goods_id"
  67. :hide-stock="skuData.sku.hide_stock"
  68. :quota="skuData.quota"
  69. :quota-used="skuData.quota_used"
  70. :custom-stepper-config="customStepperConfig"
  71. :message-config="messageConfig"
  72. :show-soldout-sku="false"
  73. @buy-clicked="onBuyClicked"
  74. @add-cart="onAddCartClicked"
  75. />
  76. <van-button
  77. block
  78. type="primary"
  79. @click="showSoldout = true"
  80. >
  81. {{ $t('hideSoldoutSku') }}
  82. </van-button>
  83. </div>
  84. </demo-block>
  85. <demo-block :title="$t('advancedUsage')">
  86. <div class="sku-container">
  87. <van-sku
  88. v-model="showCustom"
  89. :stepper-title="$t('stepperTitle')"
  90. :sku="skuData.sku"
  91. :goods="skuData.goods_info"
  92. :goods-id="skuData.goods_id"
  93. :hide-stock="skuData.sku.hide_stock"
  94. :quota="skuData.quota"
  95. :quota-used="skuData.quota_used"
  96. show-add-cart-btn
  97. reset-stepper-on-hide
  98. :initial-sku="initialSku"
  99. :message-config="messageConfig"
  100. @buy-clicked="onBuyClicked"
  101. @add-cart="onAddCartClicked"
  102. >
  103. <template
  104. slot="sku-header-price"
  105. slot-scope="props"
  106. >
  107. <div class="van-sku__goods-price">
  108. <span class="van-sku__price-symbol">¥</span><span class="van-sku__price-num">{{ props.price }}</span>
  109. </div>
  110. </template>
  111. <template
  112. slot="sku-actions"
  113. slot-scope="props"
  114. >
  115. <div class="van-sku-actions">
  116. <van-button
  117. bottom-action
  118. @click="onPointClicked"
  119. >
  120. {{ $t('button1') }}
  121. </van-button>
  122. <van-button
  123. type="primary"
  124. bottom-action
  125. @click="props.skuEventBus.$emit('sku:buy')"
  126. >
  127. {{ $t('button2') }}
  128. </van-button>
  129. </div>
  130. </template>
  131. </van-sku>
  132. <van-button
  133. block
  134. type="primary"
  135. @click="showCustom = true"
  136. >
  137. {{ $t('advancedUsage') }}
  138. </van-button>
  139. </div>
  140. </demo-block>
  141. </demo-section>
  142. </template>
  143. <script>
  144. import skuData from './data';
  145. import { LIMIT_TYPE } from '../constants';
  146. export default {
  147. i18n: {
  148. 'zh-CN': {
  149. title2: '自定义步进器',
  150. hideSoldoutSku: '隐藏售罄规格',
  151. stepperTitle: '我要买',
  152. button1: '积分兑换',
  153. button2: '买买买'
  154. },
  155. 'en-US': {
  156. title2: 'Custom Stepper Related Config',
  157. hideSoldoutSku: 'Hide Soldout Sku',
  158. stepperTitle: 'Stepper title',
  159. button1: 'Button',
  160. button2: 'Button'
  161. }
  162. },
  163. data() {
  164. this.skuData = skuData;
  165. return {
  166. showBase: false,
  167. showCustom: false,
  168. showStepper: false,
  169. showSoldout: false,
  170. closeOnClickOverlay: true,
  171. initialSku: {
  172. s1: '30349',
  173. s2: '1193',
  174. selectedNum: 3
  175. },
  176. customSkuValidator: () => '请选择xxx',
  177. customStepperConfig: {
  178. quotaText: '单次限购100件',
  179. stockFormatter: (stock) => `剩余${stock}件`,
  180. handleOverLimit: (data) => {
  181. const { action, limitType, quota } = data;
  182. if (action === 'minus') {
  183. this.$toast('至少选择一件商品');
  184. } else if (action === 'plus') {
  185. if (limitType === LIMIT_TYPE.QUOTA_LIMIT) {
  186. this.$toast(`限购${quota}件`);
  187. } else {
  188. this.$toast('库存不够了');
  189. }
  190. }
  191. }
  192. },
  193. messageConfig: {
  194. uploadImg: (file, img) => new Promise(resolve => {
  195. setTimeout(() => resolve(img), 1000);
  196. }),
  197. uploadMaxSize: 3
  198. }
  199. };
  200. },
  201. methods: {
  202. onBuyClicked(data) {
  203. this.$toast('buy:' + JSON.stringify(data));
  204. },
  205. onAddCartClicked(data) {
  206. this.$toast('add cart:' + JSON.stringify(data));
  207. },
  208. onPointClicked() {
  209. this.$toast('积分兑换');
  210. }
  211. }
  212. };
  213. </script>
  214. <style lang="less">
  215. .demo-sku {
  216. .sku-container {
  217. padding: 0 15px;
  218. }
  219. }
  220. </style>