javascript - 对于购物车,组件、商品或商品选项或两者都应该是什么?

标签 javascript vue.js

我有以下数据需要转换为表单。

var contract = [
  {
    contract_id: 1,
    options: [
      { contract_option_id: 2, contract_id: 1, payment: 'first', price: 100 },
      { contract_option_id: 3, contract_id: 1, payment: 'second', price: 100 },
      { contract_option_id: 4, contract_id: 1, payment: 'full', price: 200 }
    ]
  },
  {
    contract_id: 2,
    options: [
      { contract_option_id: 5, contract_id: 2, payment: 'first', price: 200 },
      { contract_option_id: 6, contract_id: 2, payment: 'second', price: 100 },
      { contract_option_id: 7, contract_id: 2, payment: 'full', price: 300 }
    ]
  },
];

我基本上是在创建一个“购物车”来支付契约(Contract)分期付款。每个合约都有很多contract_options,都是分期付款。他们可以根据自己的选择一次性支付第一份、第二份或整个契约(Contract)的费用。

因此,我需要创建一个仅允许为每个项目添加一个契约(Contract)选项的表单。这是我所拥有的,但我在保持项目彼此独立方面遇到了问题,并且想知道我是否应该制作项目或项目选项的组件?

 <table>
   <tr v-for="contract in availableContracts">
     <td>
       <div v-for="option in contract.options">
         <input type="radio" @click="storeInCart(option)" name="item_{{option.contract_id}}" value={{option.price}} >
         {{ option.payment }} ({{ option.price| currency }})
    </div>
  </td>

  <td>
    <button @click="addItem(item)">
      add to cart
    </button>
  </td>

  // remove shows up when item added
  <td><a @click="removeItem(item)">remove</a></td>
</tr>

new Vue({
el: "#search-results",

data: {
  availableItems: items,
  selectedItem: {},
  cart: cartStorage.fetch()
},

watch: {
  cart: {
    handler: function(cart) {
      cartStorage.save(cart);
    },
    deep: true
  }
},

computed: {
  subTotal: function() {
    var total = 0;
    var cartSize = this.cart.length;
    for(var i = 0; i < cartSize; i++) {
      total += this.cart[i].options[0].price;
    }
    return (total / 100).toFixed(2);
  }
},

methods: {
  addItem: function() {
    this.cart.push(this.selectedItem);
  },

  removeItem: function(item) {
    this.cart.splice(this.cart.indexOf(item), 1);
  },

  storeInCart: function(option) {
    this.selectedContract = {
      contract_id: option.contract_id,
      options: [option]
    };
  }
}
});

最佳答案

组件本身并不能使这种数据管理变得更容易。它们更多地是关于隔离和重用。这是我的建议。

storeInCart: function(option) {
    this.selectedContracts[option.contract_id] = {
      contract_id: option.contract_id,
      options: [option]
    };
}

即将合约存储在由contract_id索引的对象中。

关于javascript - 对于购物车,组件、商品或商品选项或两者都应该是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38019606/

相关文章:

javascript - 选择导航到 URL 上的单选按钮

javascript - .net 应用程序中的 NoVNC 集成

javascript - 通知用户消息仍在输入中

vue.js - 为什么 Vue 的受控 `&lt;input/>` 没有处理程序仍然可以在其中输入文本?

javascript - 在 v-for 内的 vue js 中编辑状态

javascript - 使用 Jest,在 vue.js 中对单个文件组件进行单元测试时如何监视扩展组件的方法

javascript - 单击 Shiny 数据表中的按钮后如何滚动到底部

javascript - 如何使用 JavaScript 检查 "Group"中的特定单选框

javascript - 使用 JavaScript 插入 HTML 实体的问题

javascript - 如何向 vue.js 中的复选框元素添加/删除类?