我对Redux非常陌生,对于如何更新嵌套状态感到困惑。
const initialState = {
feature: '',
scenarios: [{
description: '',
steps: []
}]
}
我知道只要以不可变的方式推送数组,我们就可以做到,
state = {
scenarios: [...state.scenarios, action.payload]
}
并且正如这个SO答案所暗示的那样推进特定属性 How to access array (object) elements in redux state,我们可以做到
state.scenarios[0].description = action.payload
但我的问题是,如果没有提及索引,我们如何访问对象数组中的特定属性?有没有办法让我们把它推到最后一个空元素?
欢迎所有建议帮助我理解,提前谢谢:)
答案 0 :(得分:3)
Redux有助于解耦您的状态转换以及呈现数据的方式。
修改阵列只发生在Reducer中。通过使用标识符可以轻松指定要修改的场景描述。如果您的方案具有id,则应将其包含在您的操作中,例如
{
"type": "update_scenario_description",
"payload": {
"scenario": "your-id",
"description": "New content here"
}
}
每个方案都可以有一个reducer。所有方案的更高级别的reducer可以根据方案ID将操作转发到特定的reducer,以便只更新此方案。
在您的ui中,您可以使用场景阵列和场景ID来仅渲染您当前正在查看的特定场景。
有关更详细的说明,have a look at the todo example。这基本上是相同的,因为每个待办事项都有一个id,你有一个所有待办事项的减速器和每个待办事项的特定减速器,由它的id处理。
答案 1 :(得分:1)
除了接受的答案之外,我想提一些事情,以防有人仍想“在不提及索引的情况下访问对象数组中的特定属性”。
'use strict'
const initialState = {
feature: '',
scenarios: [{
description: '',
steps: []
}]
}
let blank = {}
Object.keys(initialState.scenarios[0]).map(scene => {
if (scene === 'steps'){
blank[scene] = [1, 2]
} else {
blank[scene]=initialState.scenarios[0][scene]
}
})
const finalState = {
...initialState,
scenarios: blank
}
console.log(initialState)
console.log(finalState)
但是,如果scenarios
的{{1}}属性而不是数组中的对象,如果它是一个简单的对象,如initialState
,解决方案就会简单得多:
scenarios:{description:'', steps: []}