2 回答

TA貢獻(xiàn)1828條經(jīng)驗(yàn) 獲得超13個贊
計算屬性默認(rèn)是 getter-only
您嘗試在沒有set 方法的情況下更改計算屬性的方式??赡馨l(fā)生的情況是,僅更改對象屬性而不創(chuàng)建新屬性可能不會觸發(fā)更新 UI 的反應(yīng)。
我實(shí)際上建議采用另一種方法并將邏輯移動到存儲的變異方法,僅傳遞您需要增加/減少的產(chǎn)品的 id。并且還使用一種在更新后返回一個全新對象的map()
方法(比如我用來更改cartProducts
.
商店.js:
import Vue from "vue";
import Vuex from "vuex";
import VuexPersist from "vuex-persist";
Vue.use(Vuex);
const vuexPersist = new VuexPersist({
key: "my-app",
storage: window.localStorage
});
export default new Vuex.Store({
state: {
cartProducts: [
{
id: 1,
name: "Drug 1",
quantity: 1
},
{
id: 2,
name: "Drug 2",
quantity: 1
}
]
},
mutations: {
INCREMENT(state, productId) {
state.cartProducts = state.cartProducts.map(product => {
if (product.id === productId) {
product.quantity += 1;
}
return product;
});
},
DECREMENT(state, productId) {
state.cartProducts = state.cartProducts.map(product => {
if (product.id === productId) {
product.quantity -= 1;
}
return product;
});
}
},
actions: {
incrementQuantity({ commit }, productId) {
commit("INCREMENT", productId);
},
decrementQuantity({ commit }, productId) {
commit("DECREMENT", productId);
}
},
plugins: [vuexPersist.plugin]
});
購物車.js
<template>
<table>
<tbody>
<tr v-for="product in cartProducts" :key="product.name">
<td class="quantity">
<button @click="decreaseQuantity(product)">decrease</button>
<p>{{ product.quantity || 0 }}</p>
<button @click="increaseQuantity(product)">increase</button>
</td>
</tr>
</tbody>
</table>
</template>
<script>
export default {
computed: {
cartProducts() {
return this.$store.state.cartProducts;
}
},
methods: {
increaseQuantity(drug) {
this.$store.dispatch("incrementQuantity", drug.id);
},
decreaseQuantity(drug) {
this.$store.dispatch("decrementQuantity", drug.id);
}
}
};
</script>

TA貢獻(xiàn)1805條經(jīng)驗(yàn) 獲得超9個贊
請仔細(xì)閱讀 vuex 文檔。- https://vuex.vuejs.org/guide/ 改變狀態(tài)應(yīng)該發(fā)生在突變方法中。這是文檔中的一個簡單示例:
const store = new Vuex.Store({
state: {
count: 0
},
mutations: {
increment (state) {
state.count++
}
},
actions: {
increment (context) {
context.commit('increment')
}
}
})
添加回答
舉報