Redux 更新存储属性
我收到API的回复如下:Redux 更新存储属性,redux,Redux,我收到API的回复如下: { "results": { "6": { "id": 6, "name": "akkha madrasi mirchi1", }, "7": { "id": 7, "name": "almonds", }, "8": { "id": 8,
{
"results": {
"6": {
"id": 6,
"name": "akkha madrasi mirchi1",
},
"7": {
"id": 7,
"name": "almonds",
},
"8": {
"id": 8,
"name": "alu1",
}
}
}
我将response.results存储在results reducer store{}中,以便可以将结果作为store.results进行访问。我想修改结果中的一个对象。API只返回更新的对象。现在我想更新store.results中的id:6
{
"results": {
"6": {
"id": 6,
"name": "Modified akkha madrasi mirchi1",
}
}
}
如果我在结果缩减器中执行此操作:
[...state,action.response]
带有键6的对象是否会用匹配键替换对象
我希望州名更改为修改的akkha madrasi mirchi1,id:6:
我希望对象即使嵌套也能更新。只需匹配钥匙并继续更换。假设状态为:
{
"6": {
"id": 6,
"name": "akkha madrasi mirchi1"
},
"7": {
"id": 7,
"name": "almonds"
},
"8": {
"id": 8,
"name": "alu1"
}
}
您希望使用以下内容进行更新:
const obj = {
"6": {
"id": 6,
"name": "Modified akkha madrasi mirchi1"
}
};
然后,以下操作将完成此操作:
state = Object.assign( {}, state, obj);
如果我在结果缩减器中执行此操作:
[...state,action.response]
带有键6的对象是否会用匹配键替换对象
不可以。如果您的状态是数组,那么您可能会使用它,但是从您提供的信息来看,它是一个对象,所有结果都是一个以ID作为键的对象
您可能正在寻找以下内容:
return {
...state,
...action.response.results
}
这将创建状态的浅拷贝,如果不需要的话,保存每个结果项的对象引用比执行深度拷贝更有效。然后,它将用响应中的任何内容覆盖以前的id:6.results
{
"results": {
"6": {
"id": 6,
"name": "Modified akkha madrasi mirchi1",
}
}
}
关于这一点,需要记住以下几点:
它假定您有可用的对象排列。如果不是,Object.assign{},state,action.response.results将具有相同的效果,但IMHO没有那么清楚
从服务器返回的内容将完全替换id:6中已有的内容。这意味着,如果您正在跟踪客户机中该id的各种状态,或者服务器没有返回您需要的所有信息,那么您可能会得到一些意外的结果
常量状态={
6: {
id:6,
名称:'akkha madrasi mirchi1'
},
7: {
id:7,
名称:“杏仁”
},
8: {
id:8,
名称:“alu1”
}
}
常数响应={
结果:{
6: {
id:6,
名称:“改良阿克哈宗教学校1”
}
}
}
console.log{
状态
…响应。结果
} 我可以使用不变性助手来完成它 这是我的行动创造者:
export function itemupdate(response) {
return {
type: 'ITEMS_UPDATE_DATA_SUCCESS',
idx: Object.keys(response.results)[0],
obj: response.results[Object.keys(response.results)[0]]
}
}
这就是我在结果中替换特定id对象的方式
export function data(state = {}, action) {
case 'ITEMS_UPDATE_DATA_SUCCESS':
return update(state,{results: {[action.idx]: {$set: action.obj} }})
default:
return state;
}
你的问题是什么,但它嵌套在结果中。这将替换结果中的所有内容。不,不会。我假设状态只是Redux存储的结果部分。。。在这种情况下,它将只覆盖id:6。对于combinereducer类型的排列来说,这是正常的,您提到过您特别提到了结果减缩器。这是结果减缩器,但我存储的对象与结果一起。状态={results:{results:{1:{obj},2:{obj},3:{obj}},…..}。它的not状态={results:{1:{obj},2:{obj},3:{obj},…}这就是您所提到的。原因是我想知道如何更新嵌套在另一个对象中的对象。我有一个选择是使用Normalizer,但这看起来很多,或者我应该从一开始就实现它。所以它是整个存储的缩减器?通常使用CombineReducer,您将为eac提供一个单独的对象或数组h“chunk”的reducer,这将成为state。好的,我已经更新了注释,假设我使用combinedreducer作为state。然后对象嵌套在两个结果中。