我有一个相当复杂/嵌套的redux存储,如下所示:
{
object1
{
array:
[
object[1]: {
id: 1,
replace: ""
}
object[2]: {
id: 2
replace: ""
}
object[3]: {
id: 3,
replace: ""
}
]
}
}
在调度一个动作后,我需要根据ID将该动作插入到其中一个对象[]中。我目前正在使用以下脚本来更新减速器内的替换。但是,这会将数组更改为对象,因为对象2:{}的大括号。
case UPDATE:
return {
...state,
object1: {
...state.object1,
array: {
...state.object1.array,
[action.id]: {
...state.object1.array[action.id],
replace: action.result
}
}
}
};
我的渲染将在此之后中断,因为object2.map在更改为object后不再是函数。如何在不将其转换为对象的情况下解决此问题?
以下操作将失败,出现语法错误:
case UPDATE:
return {
...state,
object1: {
...state.object1,
array: [
...state.object1.array,
[action.id]: {
...state.object1.array[action.id],
replace: action.result
}
]
}
};
下面是使用不可变性帮助包的代码。
case UPDATE:
return update(state, {
object1: {
array: {
[action.id]: {
replace: {
$set: action.result
},
},
},
}
});
'您可以检查库immutadot。它的目的是以一种非常简洁的方式帮助更新复杂的嵌套数据结构,它的创建考虑了redux的使用。
在你的情况下,你可以这样写:
import { set } from 'immutadot'
...
case UPDATE:
return set(state, 'object1.arrary[' + id + '].replace', action.result)
// or with templated string
return set(state, `object1.arrary[${ id }].replace`, action.result)
...
它依赖于木材下的lodash,因此您可以使用lodash的所有功能。
你不能直接指定你想要用传播语法修改的索引,你需要先找到索引,然后像
case UPDATE:
var idx = state.object1.object2.findIndex(obj => obj.id === action.id)
return {
...state,
object1: {
...state.object1,
object2: [
...state.object1.object2.slice(0, idx),
{
...state.object1.object2[idx],
replace: action.result
}
...state.object1.object2.slice(idx + 1)
]
}
};
或者,您可以使用immutability helper包。有关如何操作的示例,请参见此答案
如何使用Immutability helper更新数组中的嵌套对象?
问题内容: 有没有一种方法可以更新对象中的值? 假设我要为id = 2的项更新名称和值项; 我尝试了以下w /猫鼬: 这种方法的问题在于它会更新/设置整个对象,因此在这种情况下,我会丢失id字段。 猫鼬中是否有更好的方法来设置数组中的某些值,但不理会其他值? 我也只查询了这个人: 问题答案: 你近了 您应该在使用update运算符时使用点符号来做到这一点:
是否有方法更新对象中的值? 假设我想更新id=2的项目的名称和值项目; 我尝试过以下猫鼬: 这种方法的问题在于它更新/设置了整个对象,因此在本例中,我丢失了id字段。 在mongoose中有没有更好的方法来设置数组中的某些值,而不设置其他值? 我也问过只是人:
问题内容: 如果您将数组作为状态的一部分,并且该数组包含对象,那么通过更改其中一个对象来更新状态的简便方法是什么? 示例,从关于react的教程中修改而来: 问题答案: 在更新状态时,关键部分是将其视为不变。如果可以保证,任何解决方案都可以。 这是我使用immutability-helper的解决方案: jsFiddle:
我有一系列推车。我想更新请求对象中的产品数量。即。 我有一个数组的产品和数量,比如: 我想更新它们,如: 这可能的逻辑是什么?
我想根据等于传递的属性删除嵌套对象。此时,将替换整个对象。当我尝试使用useState更新状态时,我遗漏了一些东西,可能是我循环对象的方式? 更新:问题已关闭,以响应更新嵌套对象的可用答案。这个问题涉及阵列,我认为这是当前问题的一部分。请注意此问题与的性质差异。可能需要使用语句,或者使用不同的方法对id进行过滤。。 我的初始对象看起来像这样: 我这样浏览每一项:
我正在尝试更新我的猫鼬数据- 这里是数据结构- 现在我必须更新产品数量和价格。 这是我的练习-