Попытка создать динамическую форму со списком каждого продукта из БД. Форма имеет следующие поля для каждого продукта: название продукта, цена продукта, количество и общая стоимость. Моя проблема заключается в том, что я не уверен, как добавить поле v-модели для каждого ввода количества продукта, поскольку список извлекается из v-для всех продуктов. Вот часть моего шаблона Компонент vue ProductsListForm:
<div v-for = "product in products" :key = "product.id" class = "flex form-group">
<div class = "flex p-title">
<label :for = "product.title">{{ product.title }}</label>
<small>{{ product.price }}$</small>
</div>
<div class = "flex p-input">
<input class = "input" type = "number" :name = "product.title" v-model = "quantity">
</div>
<div class = "flex p-total">
<span>Total: {{ product.price * quantity}}</span>
</div>
</div>
export default {
props: ['products'],
data() {
return {
quantity: 0,
}
},
methods: {}
}
Итак, мой вопрос: как я могу привязать количество к каждому отдельному продукту? Прямо сейчас он, очевидно, меняется всякий раз, когда обновляется ЛЮБОЕ поле ввода... Любая помощь будет оценена!
v-modeling свойство элемента массива работает, как вы можете видеть в этой скрипте: jsfiddle.net/Йовар/nj0w7oye/3@ Yovar quantity не имеет отношения к каждому продукту. Это переменная, связанная с самой формой. Когда я пытаюсь сделать это таким образом, общее количество равно NaN
@Yovar форма предназначена для использования в качестве списка покупок. Клиент вводит количество каждого продукта (количество), поэтому наличие количества в качестве поля базы данных для каждого продукта не является предполагаемой целью.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Чтобы количество было связано с продуктом (ввод продуктов) - вам нужно будет передать его продуктам или сделать его массивом.
<div v-for = "product in products" :key = "product.id" class = "flex form-group">
<div class = "flex p-title">
<label :for = "product.title">{{ product.title }}</label>
<small>{{ product.price }}$</small>
</div>
<div class = "flex p-input">
<input class = "input" type = "number" placeholder = "1" :name = "product.title" v-model = "quantity[product.id]">
</div>
<div class = "flex p-total">
<span>Total: {{ product.price * getProductQuantity(product) }}</span>
</div>
</div>
export default {
props: ['products'],
data() {
return {
quantity: [],
}
},
methods: {
getProductQuantity(product) {
return this.quantity[product.id] || 0;
}
}
}
Вместо использования v-model вы можете прослушивать события input для каждого элемента.
new Vue({
el: '#app',
data: () => ({
cart: [],
products: [{
id: 1,
name: 'foo'
},
{
id: 2,
name: 'bar'
},
{
id: 3,
name: 'baz'
}
]
}),
methods: {
updateCart(event, product) {
const index = this.cart.findIndex(i => i.name === product.name)
const item = {
name: product.name,
quantity: event.target.value
}
if (index !== -1) {
this.cart.splice(index, 1, item)
} else {
this.cart.push(item)
}
}
}
})ul,
li {
list-style: none;
}
#app {
display: flex;
flex-direction: row;
justify-content: space-around;
}<script src = "https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>
<div id = "app">
<div>
<h5>products</h5>
<ul>
<li v-for = "product in products" :key = "product.id">
<label>{{ product.name }}</label>
<input @input = "updateCart($event, product)" min = "0" type = "number">
</li>
</ul>
</div>
<div>
<h5>cart</h5>
<ul v-if = "cart.length">
<li v-for = "item in cart" :key = "item.id">
<p>{{ item.name }} {{ item.quantity }}</p>
</li>
</ul>
<p v-else>no items in cart</p>
</div>
</div>
Является ли
quantityинформацией, которая есть у каждого продукта? Работает ли он, когда вы называете егоproduct.quantity?