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,
},
},
},
},
},
});
}