2017-10-05 77 views
1

使用React/Redux,我有一个简单的反应游戏,用户响应来自多个选项的提示,我想记录响应以及它是否正确。我有一个'GAME_BEGIN'减速像如何在REDX状态下访问数组(对象)元素

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 
     } 
    ] 
    }; 

现在我想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调用将必要的数据登录到数据库。这是做事的预期方式吗?

+0

目前尚不清楚你想要做什么。你需要回答以前的问题吗?一般情况下,商店代表您的应用程序的状态,并且您选择那是什么。如果你需要添加一个对象到数组中,或者改变其中一个元素,它就像任何平常的javascript对象一样工作。 – JulienD

+0

嗯,我这么认为,但是例如,在'GAME_SUBMIT_RESPONSE'还原器中返回'... state,state.problems [state.problems.length - 1] .response:action.response'不起作用,我只是得到一个错误。我可以在每个响应中重写整个'problems'数组,但如果他们回答了很多问题,那么这个数组就会变大。 – TrivialCase

回答

3

怎么样复制你的状态第一

let newState = {...state}; 

则进行更新像任何其他JS对象

newState.problems[2].response = 42; 

然后返回它的元素/值中的一个?

return newState; 

减速机只是一个功能,您不必立即返回。单线不是不可能的,但可能不可读(slice,concat,...)。

+0

*叹*我是一个白痴,这可能是我应该考虑的第一件事...谢谢! – TrivialCase