javascript - 当其中一个字段是数组时如何更改状态对象?
问题描述
我有一个这种形式的状态树:
const initialState = {
total: 0,
discount: 0,
typeDiscount: 0,
products: data
};
其中products字段是一个数组,数组是这样的:
[{
"id":9090,
"name":"Item1",
"price":200,
"discount":10,
"type":"fiction",
"quantity": 1,
"img_url":"https://store.lexisnexis.com.au/__data/media/catalog/thumb//placeholder.jpg"
},
{
"id":9091,
"name":"Item2",
"price":250,
"discount":15,
"type":"literature",
"quantity": 1,
"img_url":"https://store.lexisnexis.com.au/__data/media/catalog/thumb//placeholder.jpg"
}]
现在我正在尝试更改该数组中的数量,我是 Redux 的新手,所以请指导我如何做到这一点?
这是我的减速器:
case types.ADD_ITEM_CART:
let product_add = state.products
for (let i = 0; i < product_add.length; i++) {
if (product_add[i].id === action.id) {
product_add[i].quantity = product_add[i].quantity + 1
break
}
}
return dotProp.set(state, `products`, product_add);
解决方案
您可以使用Array.prototype.map并迭代项目并更新与id
有效负载匹配的项目。
像这样的东西:
const state = [{
"id": 9090,
"name": "Item1",
"price": 200,
"discount": 10,
"type": "fiction",
"quantity": 1,
"img_url": "https://store.lexisnexis.com.au/__data/media/catalog/thumb//placeholder.jpg"
},
{
"id": 9091,
"name": "Item2",
"price": 250,
"discount": 15,
"type": "literature",
"quantity": 1,
"img_url": "https://store.lexisnexis.com.au/__data/media/catalog/thumb//placeholder.jpg"
}
];
const payload = {
id: 9091
};
const nextState = state.map(product => {
if (product.id !== payload.id) {
// not our product, return as is
return product;
}
return {
...product,
quantity: product.quantity + 1
}
});
console.log(nextState);
.as-console-wrapper {
max-height: 100% !important;
}
要删除项目,您可以使用Array.prototype.filter:
const state = [{
"id": 9090,
"name": "Item1",
"price": 200,
"discount": 10,
"type": "fiction",
"quantity": 1,
"img_url": "https://store.lexisnexis.com.au/__data/media/catalog/thumb//placeholder.jpg"
},
{
"id": 9091,
"name": "Item2",
"price": 250,
"discount": 15,
"type": "literature",
"quantity": 1,
"img_url": "https://store.lexisnexis.com.au/__data/media/catalog/thumb//placeholder.jpg"
}
];
const payload = {
id: 9091
};
const nextState = state.filter(product => product.id !== payload.id);
console.log(nextState);
推荐阅读
- angular - 这个 Angular 异步管道的正确含义是什么?
- angular - 我正在使用 Angular,我想在此示例中使用 *ngIf else(自版本 4 起可用)
- c# - Telerik RadGridview (Winform) - 如何添加组合框
- corda - 我们在 Corda Enterprise 中有广播解决方案吗?
- c++ - 为什么我的变量会根据它的引用发生变化,而不是相反?
- sql-server - 在当前表中使用 cte
- mysql - mysql错误:mysql_handledberror:成功
- laravel - 如何在 laravel 查询生成器中,为父表中的每条记录获取满足特定条件的子行数?
- jquery - 仅删除字符串
- monitoring - Grafana + Prometheus:显示事件发生频率的单一统计信息