【问题标题】:How to access an attribute in an object array in Redux state?如何在 Redux 状态下访问对象数组中的属性?
【发布时间】:2018-05-26 22:30:24
【问题描述】:

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

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

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

【问题讨论】:

    标签: javascript arrays ecmascript-6 redux


    【解决方案1】:

    Redux 有助于解耦状态转换和呈现数据的方式。

    修改你的数组只发生在你的 reducer 中。使用标识符很容易指定要修改哪个场景的描述。如果您的场景有 id,则应将其包含在您的操作中,例如

    {
      "type": "update_scenario_description",
      "payload": {
        "scenario": "your-id",
        "description": "New content here"
      }
    }
    

    每个场景都可以有一个 reducer。所有场景的上级reducer都可以根据场景id将action转发给具体的reducer,这样只会更新这个场景。

    在您的用户界面中,您可以使用场景数组和您的场景 ID 来仅呈现您当前正在查看的特定场景。

    如需更详细的解释,have a look at the todo example。这基本上是一样的,因为每个 todo 都有一个 id,你有一个用于所有 todo 的 reducer,每个 todo 有一个特定的 reducer,由它的 id 处理。

    【讨论】:

    • 非常感谢,这有帮助!但是使用这种方法,我如何能够访问场景数组中的步骤数组?我意识到拥有太多依赖项正在成为一个问题,但我没有看到任何其他解决方案。
    • 基本一样。您应该在您的操作中提供两个标识符(场景和步骤),以区分操作应该传递给哪个减速器。因此,您可以在场景化简器中实现步进转发,就像从场景化简器中转发它们一样,或者将一个单独的化简器添加到您的场景化简器中,它只处理两个 id 的步进。
    【解决方案2】:

    除了公认的答案之外,我想提一点,以防有人仍然想“访问对象数组中的特定属性而不提及索引”。

    '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)

    但是,如果initialStatescenarios 属性不是数组内的对象,而是像scenarios:{description:'', steps: []} 这样的简单对象,则解决方案会简单得多:

    'use strict'
    const initialState = {
      feature: '',
      scenarios: {
          description: '',
          steps: []
      }
    }
    
    const finalState = {
      ...initialState,
      scenarios: {
        ...initialState.scenarios, steps: [1, 2, 4]
      }
    }
    
    console.log(initialState)
    console.log(finalState)

    【讨论】:

    • 一个非常有帮助的答案,非常感谢!!我还想问..我知道结构中的依赖根本没有帮助。但我需要一个场景数组,其中每个场景都包含一个步骤数组。你能建议任何解决这个问题的方法吗?而不是嵌套数组?
    • 抱歉,您能否更详细地描述一下,这如何有助于仅修改特定场景中特定步骤的单个属性?
    • @NivedithaKarmegam 在举个例子的同时发布一个问题,我会尽力回答。 PS:我也是redux的新手
    • @MartinSeeler 要求有多个场景,每个场景都有自己的一组步骤。并且步骤和场景的数量不是固定的,它取决于用户。此外,步骤和场景应该是可编辑、可删除和可交换的,所以我认为数组是最好的选择。正如 BlackBeard 建议的那样,我还将发布一个新问题,以便更具描述性。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-01
    • 1970-01-01
    • 2019-03-20
    • 2019-01-19
    • 2021-08-23
    • 1970-01-01
    • 2020-10-31
    相关资源
    最近更新 更多