Во-первых, с точки зрения потока vue, помните, никогда не мутируйте напрямую подпорки . Вместо этого вы должны изменить данные в родительском компоненте. Для этого рекомендуется создать копию реквизитов в дочерних данных, поэтому при нажатии на кнопку дочерние данные изменяются -> изменяются родительские данные, что также приводит к изменению дочерних реквизитов. Есть много способов сделать это. У меня нет родительского кода компонента, поэтому я создаю общий c код ниже, вы можете выполнить следующие действия:
используя syn c
в родительских компонентах
<parent :products.sync=products />
в методах дочерних компонентов:
data() {
return {
productListInChildren: this.products; // pass props to children inner data
}
},
methods: {
incrementItem(index) {
//do modification in productListInChildren
let item = this.productListInChildren[index];
this.productListInChildren[index].product_quantity =
this.productListInChildren[index].product_quantity + 1;
// update it back to parents
this.$emit('update:products', this.productListInChildren)
}
}
<div v-for="(products, index) in productListInChildren"> // use productListInChildren instead
<mdc-layout-cell span="2" align="middle">
{{ products.product_barcode }}
</mdc-layout-cell>
<mdc-layout-cell span="2" align="middle">
{{ products.product_quantity}}
</mdc-layout-cell>
<i class="mdc-icon-toggle material-icons float-left"
aria-pressed="false"
v-on:click="incrementItem(index)">
add </i>
</div>
Второе: с точки зрения дизайна кода, в вашем случае рекомендуется, чтобы дети обрабатывали только логику c отображения (немой компонент) . Логи c изменяющихся данных должны быть перенесены на родителей (как контроллер). Если это так. Вы можете создать метод в родительском компоненте и добавить логику приращения c:
родительские компоненты
<parent :products=products @increment="incrementInParent"/>
methods: {
incrementInParent() {// move the logic here}
}
дочерние компоненты
methods: {
incrementItem(index) {
// call the methods in parents
this.$emit("increment");
}
}