javascript - 如何将一个对象属性添加到状态中的另一个属性?

标签 javascript reactjs ecmascript-6 redux

我正在我的 react-redux 应用程序中设置操作和缩减器。我需要一个函数来更新状态中的属性并将对象添加到其列表中,如果可能的话使用传播语法。这是我到目前为止所拥有的:

const defaultState = {
  genres: {}
}

export default function(state = defaultState, action) {
  switch(action.type) {
    case 'ADD_GENRE':
      return {
        ...state,
        genres[action.name]: action.list //new code here
      }
    default:
      return state;
  }
}

我需要 genres 属性可以像数组一样使用其属性名称进行动态访问,如下所示:

const getMusicFromGenre = (genre) => {
  return state.genres[genre];
}

reducer 应该接受以下操作,然后相应地修改状态:

// action
{
  type: 'ADD_GENRE,
  name: 'Rock',
  list: ['Bohemian Rhapsody', 'Stairway to Heaven', 'Hotel California']
}

// old state
{
  genres: {
    "Pop": ['Billie Jean', 'Uptown Funk, 'Hey Jude']
  }
}

// new state
{
  genres: {
    "Pop": ['Billie Jean', 'Uptown Funk, 'Hey Jude'],
    "Rock": ['Bohemian Rhapsody', 'Stairway to Heaven', 'Hotel California']
  }
}

如有必要,我愿意使用不同的方法。

最佳答案

您走在正确的轨道上,但需要分别处理每一层嵌套。这是我为 http://redux.js.org/docs/recipes/reducers/ImmutableUpdatePatterns.html 写的一个例子:

function updateVeryNestedField(state, action) {
    return {
        ....state,
        first : {
            ...state.first,
            second : {
                ...state.first.second,
                [action.someId] : {
                    ...state.first.second[action.someId],
                    fourth : action.someValue
                }
            }
        }
    }
}

您可能还想阅读我在 http://redux.js.org/docs/recipes/reducers/PrerequisiteConcepts.html#immutable-data-management 链接的一些关于不可变数据处理的文章和 https://github.com/markerikson/react-redux-links/blob/master/immutable-data.md .

关于javascript - 如何将一个对象属性添加到状态中的另一个属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42659215/

相关文章:

javascript - 使用 javascriptcore 框架调用 javascript 函数将 [object Object] 返回给 JSValue

javascript - 如何在html5中使用css3在灯箱中显示编辑输入字段

javascript - 按住按钮连续滚动 ReactJS

javascript - ES6继承reactjs类时添加默认属性

javascript - babel-loader 错误 - TypeError : val is not a function

javascript - 我如何在 extjs 中访问这个内部项目

javascript - ASP .NET 5 中的简单 Angular SPA - 启动时出现空白页

javascript - es6 addeventlistener - 无法读取未定义的属性 'classList'

reactjs - 带有 postcss 的 mini-css-extract 插件抛出 this.getOptions 不是一个函数

javascript - ESLint 在基于 es6 的导入时失败 npm run build