Javascript 更新redux存储中数组中的嵌套对象

Javascript 更新redux存储中数组中的嵌套对象,javascript,reactjs,redux,Javascript,Reactjs,Redux,所以我一直在努力寻找最佳实践,在不直接改变商店的情况下改变商店。尤其是当它嵌套时 我已经看过一些关于这方面的优秀文章,但我仍然不知道如何在我的场景中实现这一完美。() 在我的例子中,我有一个提案存储,其中包含记录,每个记录(提案)都包含一个清单,它是一个如下所示的数组: checklist: [ { label: 'lease_sign', done: false } ], 我想将done更改为true。 现在,我的WebSocket触发了此操作: ca

所以我一直在努力寻找最佳实践,在不直接改变商店的情况下改变商店。尤其是当它嵌套时

我已经看过一些关于这方面的优秀文章,但我仍然不知道如何在我的场景中实现这一完美。()

在我的例子中,我有一个
提案
存储,其中包含
记录
,每个记录(
提案
)都包含一个
清单
,它是一个如下所示的数组:

checklist: [
    {
      label: 'lease_sign',
      done: false
    }
],
我想将
done
更改为
true
。 现在,我的WebSocket触发了此操作:

case CHECK_TODO_ITEM: {
    const { data } = action;

    // find match record
    const proposal = _.find(state.records, ['uuid', data.proposal]);
    // find match check
    const check = _.find(proposal.checklist, ['label', data.item]);
    // change check to true
    check.done = true;

    // find index of propsal in the current state
    const index = _.findIndex(state.records, (p) => p.uuid === data.proposal);

    // re-asign state
    return _.assign({}, state, {
        records: _.assign({}, state.records, {
            [index]: proposal,
        }),
    });
}
我也尝试过:

return {
    ...state,
        records: {
            ...state.records,
            [index]: {
                ...state.records[index],
                checklist,
            }
        }
    }
};
但这仍在使国家偏离轨道。我想不出做这件事的最佳方法是什么


如果有人能帮我,那就太好了

对我来说,更新不可变状态的最佳库是

有了这个,你可以做类似的事情(idk,如果它有效,但你有这个想法):


对我来说,更新不可变状态的最佳库是

有了这个,你可以做类似的事情(idk,如果它有效,但你有这个想法):


只需使用如下所示的
map
,并对对象使用spread操作符。
map
..
都是不可变的操作。
const清单=[
{id:1,done:false},
{id:2,done:false},
{id:3,done:false}
]
const setDone=id=>checklist.map(项=>(
id==item.id?{…item,done:true}:item
))

console.log(setDone(2))只需使用如下所示的
map
和对象的spread运算符。
map
..
都是不可变的操作。
const清单=[
{id:1,done:false},
{id:2,done:false},
{id:3,done:false}
]
const setDone=id=>checklist.map(项=>(
id==item.id?{…item,done:true}:item
))
console.log(setDone(2))对象是通过ECMAScript中的引用而不是值来分配的

通过使用下划线的
find
方法,您的
建议
检查
变量仍将引用de Redux store中的对象,然后直接修改这些对象。 您要做的是在您的操作触发减速机时“克隆”状态或所需状态的一部分。 实现克隆有多种方法:

  • 排列运算符:
    newState={…state}
  • newState=JSON.parse(JSON.stringify(state))
  • 使用lodash(因为您已经在使用它):
    newState=\uu.cloneDeep(state)
然后可以修改此新状态,并随后将其设置为存储。

对象是通过ECMAScript中的引用而不是通过值分配的

通过使用下划线的
find
方法,您的
建议
检查
变量仍将引用de Redux store中的对象,然后直接修改这些对象。 您要做的是在您的操作触发减速机时“克隆”状态或所需状态的一部分。 实现克隆有多种方法:

  • 排列运算符:
    newState={…state}
  • newState=JSON.parse(JSON.stringify(state))
  • 使用lodash(因为您已经在使用它):
    newState=\uu.cloneDeep(state)

然后可以修改此新状态,并随后将其设置为存储。

i为不可变数据结构推荐一个好的库:i为不可变数据结构推荐一个好的库:
case CHECK_TODO_ITEM: {
  const index = 8; // random record index
  const index2 = 3; // random item index
  return update(state, {
    records: {      
      [index]: {
        checklist: {
          [index2]: {
            $merge: {
              done: true,
            },
          },
        },
      },
    },
  });
}