2017-10-05 80 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