如何在 redux 状态下访问数组(对象)元素

IT技术 reactjs redux
2021-05-16 05:43:15

使用 React/Redux,我有一个简单的 React 游戏,其中用户从多个选项中响应提示,我想记录响应以及它是否正确。我有一个'GAME_BEGIN'像这样减速器

case 'GAME_BEGIN':
  return {
    ...state,
    timeRemaining: action.timeRemaining,
    gameIsInProgress: true,
    problems: [
      {
        problem: action.problem, // string
        solution: action.solution, // string
        incorrectResponses: action.incorrectResponses, // array of strings
      }
    ]
  };

现在我想在 action 上为第一个问题对象添加responseisCorrect属性'GAME_SUBMIT_RESPONSE',然后向问题数组添加一个新问题。所以经过几次迭代(可能有很多问题),我想状态应该看起来像

...state,
problems: [
  {
    problem: something, // string
    solution: something, // string
    incorrectResponses: something, // array of strings
    response: something,
    isCorrect: somethingBool
  },
  ...
  {
    problem: action.problem, // string
    solution: action.solution, // string
    incorrectResponses: action.incorrectResponses, // array of strings
  }
]

对于第一个问题,我可能会通过重写整个problems数组来添加属性,但是一旦我添加了新对象呢?

或者我是否以错误的方式思考这个问题。我还认为我可以展平状态并problems完全摆脱数组,在每次提交时重置问题,并通过 api 调用将必要的数据登录到数据库。这是预期的做事方式吗?

1个回答

先复制你的状态怎么样

let newState = {...state};

然后像任何其他 JS 对象一样更新元素/值之一

newState.problems[2].response = 42;

那你退货了吗?

return newState;

reducer 只是一个函数,你不必马上返回。单行不是不可能的,但可能不可读(slice, concat, ...)。