0

我的商店中有一组用户,设置如下:

{users: {user_id: 1, user_name: Adam, user_score: 100}, 
{user_id: 2, user_name: Bob, user_score: 200}, 
{user_id: 3, user_name: Charlie, user_score: 300}}

我的项目正在从设置如下的服务器接收 JSON 数据:

{user_id: 1, score: 10}

我想找到user_id传递的数据与现有用户集匹配的位置user_id,并将分数更新score为传入的。

例如,如果reducer 收到{user_id:2, score:10}我如何将其更改score为原始状态下10用户ID 相等的位置。2在避免突变的同时,当然!

使用此功能的最佳方法是什么?归一化?洛达什?更新()?看起来很简单,我必须在这里遗漏一些明显的东西。谢谢。

4

2 回答 2

1

在您的 reducer 中,您可以遍历现有的 users 数组并为匹配user_id.

function usersReducer(state = [], action) {
  switch (action.type) {
  case 'UPDATE_SCORE':
    var { user_id, score } = action
    return state.map(u => {
      if (u.user_id === user_id) {
        // for the matching user, return an
        // object with the updated score
        return Object.assign({}, u, { score })
      } else {
        // for all other users, return the
        // existing object
        return u
      }
    })
  default:
    return state
  }
}
于 2016-12-28T05:34:28.890 回答
1

我建议immutable.js用于此目的。

id将要更新的用户的 传递给并action从那里传递给reducer并用于immutable更新用户数据。

所以你的不可变代码就像

  const data = Immutable.fromJS(state)
  const newState = data.setIn(['users', user_id, 'score'], 10);
  return newState.toJS()

PS:我还没有测试过以上但它应该可以工作(如果没有修改一点)

您可以在此处阅读有关不可变的信息。

我也建议在这里通过类似的答案

于 2016-12-28T05:30:27.473 回答