Redux 更新存储属性

Redux 更新存储属性,redux,Redux,我收到API的回复如下: { "results": { "6": { "id": 6, "name": "akkha madrasi mirchi1", }, "7": { "id": 7, "name": "almonds", }, "8": { "id": 8,

我收到API的回复如下:

{
    "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。然后对象嵌套在两个结果中。