2017-08-06 4 views
0

Ich bin ein Anfänger in react.js. Ich mache ein Brettspiel als Anfängerprojekt. Es gibt eine Komponente, die würfelt. Wenn der Würfel gewürfelt wird, wird eine Aktion ausgelöst, so dass der Status geändert wird, um die Werte dieses gerollten Würfels widerzuspiegeln. Aber im Reduzierer sind sowohl die Werte von Zustand als auch action.data gleich. Wie ist das möglich?Irgendwie immer aktualisiert Zustand in Reducer

Ich habe einen Würfel Komponente rollen, die diese zurück:

Wenn Sie auf die Schaltfläche klicken, wird eine Aktion ausgelöst wird, das Update den Zustand sollte durch Würfel Werte in ihm hinzufügen.

rollDice(){ 
     console.log("this.props ||||| rollDice()", this.props); 
     if(this.props.isDiceRolled){ 
      alert("Move the marker..."); 
      return; 
     } 
     this.props.dispatch({ 
      type: "ROLL_DICE", 
      data: { 
       dice: Math.ceil(Math.random() * 5), 
       isDiceRolled: true 
      } 
     }); 
    } 

In Minderer:

switch(action.type){ 

    . 
    . 
    . 

    case "ROLL_DICE": { 
     console.log("ROLL_DICE"); 
     console.log(state, action.data); 
     const newTurn = Object.assign(state.currentTurn, action.data); 
     return Object.assign(state, { currentTurn: newTurn }); 
    } 
    default: { 
     return state; 
    } 

} 
+0

Wenn ich diese Zeilen ändere const newTurn = Object.assign (state.currentTurn, action.data); Rückgabe Object.assign (state, {currentTurn: newTurn}); zu diesem Rückkehr Zustand; Korrekte Werte von state und action.data werden protokolliert, obwohl console.log über diesen Anweisungen liegt. Was ist los? :( –

+1

Einige code style rat: Es ist besser, eine intermediate funktion in 'mapDispatchToProps' anstelle einer methode in der komponente:' const mapDispatchToProps = (versand) => ({rollDice:() => versand (actions.rollDice ())}); '. Dann in der Komponente rufen Sie einfach' this.props.rollDice() '. – timotgl

Antwort

4

Mit Redux, in den Reduzierungen, jedes Mal wenn Sie einen neuen Zustand zurückkehren. Anstatt also diese beiden Linien:

const newTurn = Object.assign(state.currentTurn, action.data); 
return Object.assign(state, { currentTurn: newTurn }); 

Sie sollten so etwas wie diese

const newTurn = Object.assign({}, state.currentTurn, action.data); 
return Object.assign(
    {}, 
    state, 
    { currentTurn: newTurn} 
) 

Das Problem mit Object.assign schreiben soll. Lesen Sie hier mehr: https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Object/assign

+0

OMG was habe ich getan ?! Ich dachte falsch über Object.assign - dachte, es war rein. Danke ... –

+0

Kein Problem! Einfach 'Object.assign' vereint alle Eigenschaften der ersten Parameter und gibt diese zurück, aber redux ist nicht glücklich, wenn Sie versuchen, seinen Zustand manuell zu aktualisieren – maxgallo

Verwandte Themen