如何在Redux状态下访问对象数组中的属性?

时间:2017-12-13 05:31:57

标签: javascript arrays ecmascript-6 redux

我对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

但我的问题是,如果没有提及索引,我们如何访问对象数组中的特定属性?有没有办法让我们把它推到最后一个空元素?

欢迎所有建议帮助我理解,提前谢谢:)

2 个答案:

答案 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: []}