rule.vue 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. 前端多规格选择方法
  2. 实现一个多规格选择功能的完整Vue组件需要考虑几个方面:数据模型、用户界面、事件处理以及与后端的数据交互。以下是一个简单的示例,展示如何在Vue组件中实现一个基本的多规格选择功能。
  3. <template>
  4. <div class="product-sku">
  5. <div class="sku-option">
  6. <label>颜色:</label>
  7. <button v-for="color in colors" :key="color.id" :class="{ active: selectedColor === color.id }"
  8. @click="selectColor(color.id)">
  9. {{ color.name }}
  10. </button>
  11. </div>
  12. <div class="sku-option">
  13. <label>尺寸:</label>
  14. <button v-for="size in sizes" :key="size.id" :class="{ active: selectedSize === size.id }"
  15. @click="selectSize(size.id)">
  16. {{ size.name }}
  17. </button>
  18. </div>
  19. <div class="sku-result">
  20. <p>选择的规格: {{ selectedColorName }} - {{ selectedSizeName }}</p>
  21. <p v-if="selectedSku">价格: {{ selectedSku.price }}</p>
  22. <p v-if="selectedSku">库存: {{ selectedSku.stock }}</p>
  23. </div>
  24. </div>
  25. </template>
  26. <script>
  27. export default {
  28. data() {
  29. return {
  30. colors: [{
  31. id: 1,
  32. name: '红色'
  33. },
  34. {
  35. id: 2,
  36. name: '蓝色'
  37. },
  38. // 更多颜色...
  39. ],
  40. sizes: [{
  41. id: 1,
  42. name: 'S'
  43. },
  44. {
  45. id: 2,
  46. name: 'M'
  47. },
  48. {
  49. id: 3,
  50. name: 'L'
  51. },
  52. // 更多尺寸...
  53. ],
  54. skus: [
  55. // 假设每个SKU包含颜色ID、尺寸ID、价格和库存
  56. {
  57. colorId: 1,
  58. sizeId: 1,
  59. price: 100,
  60. stock: 50,
  61. name: '红色-S'
  62. },
  63. // 更多SKU...
  64. ],
  65. selectedColor: null,
  66. selectedSize: null,
  67. selectedColorName: '',
  68. selectedSizeName: '',
  69. };
  70. },
  71. computed: {
  72. selectedSku() {
  73. return this.skus.find(
  74. sku => sku.colorId == this.selectedColor && sku.sizeId == this.selectedSize
  75. );
  76. },
  77. },
  78. // function cartesianProduct(...arrays) {
  79. // return arrays.reduce((accumulator, currentValue) => {
  80. // return accumulator.flatMap(item1 =>
  81. // currentValue.map(item2 => item1.concat(item2))
  82. // );
  83. // }, [[]]);
  84. // }
  85. // // 示例数组
  86. // const array1 = ['苹果', '香蕉'];
  87. // const array2 = ['大', '小'];
  88. // const array3 = ['甜', '酸'];
  89. // // 生成笛卡尔积
  90. // const product = cartesianProduct(array1, array2, array3);
  91. // console.log(product);
  92. methods: {
  93. selectColor(colorId) {
  94. this.selectedColor = colorId;
  95. this.selectedColorName = this.colors.find(color => color.id === colorId).name;
  96. this.updateSku();
  97. },
  98. selectSize(sizeId) {
  99. this.selectedSize = sizeId;
  100. this.selectedSizeName = this.sizes.find(size => size.id === sizeId).name;
  101. this.updateSku();
  102. },
  103. updateSku() {
  104. if (this.selectedColor && this.selectedSize) {
  105. const sku = this.selectedSku;
  106. if (sku) {
  107. console.log(`Selected SKU: ${sku.name}, Price: ${sku.price}, Stock: ${sku.stock}`);
  108. }
  109. }
  110. },
  111. },
  112. };
  113. </script>
  114. <style scoped>
  115. .sku-option button {
  116. margin: 5px;
  117. padding: 5px;
  118. border: 1px solid #ccc;
  119. border-radius: 5px;
  120. background-color: #f8f8f8;
  121. cursor: pointer;
  122. }
  123. .sku-option button.active {
  124. background-color: #42b983;
  125. color: white;
  126. }
  127. .sku-result {
  128. margin-top: 20px;
  129. }
  130. </style>