【问题标题】:Updating a state consisiting of an array of objects without mutation更新由一组对象组成的状态而没有突变
【发布时间】:2017-07-28 22:12:29
【问题描述】:

如果我有一个像这样的状态对象:

[{
   "value":"e1",
   "label":"john@example.com",
   "domain":"d1",
   "selected":false
},
{
   "value":"e2",
   "label":"jack@example.com",
   "domain":"d1",
   "selected":false
},
{
   "value":"e3",
   "label":"silvia@example.com",
   "domain":"d1",
   "selected":false
}]

和动作对象

{
    "value":"e1",
    "label":"john@example.com",
    "domain":"d1",
    "selected":false
}

在 redux reducer 中,如何将“选择”的动作对象更改为 true 并分别更新状态而不使用最好的纯 ES6 函数对其进行变异?

我对 Redux 世界很陌生,发现不改变状态就很难更新状态。

【问题讨论】:

  • Redux docs 中有专门的部分对此非常有用。
  • 但是,状态中存在一个问题——保证哪个属性是唯一值?我怀疑value 总是独一无二的
  • @ArshabhAgarwal 值是独一无二的。我正在使用 React Select 使用的结构,由于某种原因,它使用 value 作为唯一的选择选项
  • @CodingIntrigue 是的,这正是我想要的

标签: ecmascript-6 redux reducers


【解决方案1】:

其实我很久以前就自己整理过这个,但认为它可能对其他人有用:

export const select = (state, action) => {

    const index = state.findIndex(elem => elem.value === action.payload.value);

    return [
        ...state.slice(0, index),
        {
            ...action.payload,
            selected: true
        },
        ...state.slice(index + 1)
    ];
};

【讨论】:

    【解决方案2】:

    我假设当前state 中有一大堆东西,并且您想在数组中将第一个对象的selected 值更改为true,然后将其与当前状态合并并更新国家。

    假设您的“状态对象”称为foo,在您的减速器函数中,您将首先执行foo[0].selected = true; 之类的操作,然后您可以使用扩展运算符更新状态,例如:

    return {
      ...state,
      foo
    };
    

    我希望这是有道理的,或者我可能与您的要求不符?

    【讨论】:

    • 在更新它之前,我还需要将状态字段全部重置为 'selected':'false' 而不改变它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-25
    • 1970-01-01
    • 2020-07-01
    • 1970-01-01
    • 2022-01-06
    • 2019-05-09
    • 1970-01-01
    相关资源
    最近更新 更多