2017-02-24 2 views
2

Ich bekomme doppelten verschachtelten Zustand nach api Anruf. Hier ist es.Redux speichern doppelte Verschachtelung

Screenshot from redux devtools

Hier sind meine Aktionen

export const getUserSuccess = user => ({ 
 
    type: GET_USER_SUCCESS, 
 
    user, 
 
}); 
 

 
export const getUserFailure = error => ({ 
 
    type: GET_USER_FAILURE, 
 
    error, 
 
}); 
 

 
export const getUserRequest =() => (
 
    dispatch => (
 
    axios.get('./user.json') 
 
     .then(response => dispatch(getUserSuccess(response.data))) 
 
     .catch(error => dispatch(getUserFailure(error))) 
 
) 
 
);

hier ist mein Benutzerminderer

export default function user(state = {}, action) { 
 
    switch (action.type) { 
 
    case GET_USER_SUCCESS: 
 
     return { 
 
     ...state, 
 
     user: action.user, 
 
     }; 
 
    case GET_USER_FAILURE: 
 
     return { 
 
     ...state, 
 
     error: action.error, 
 
     }; 
 
    default: 
 
     return state; 
 
    } 
 
}

und hier ist meine Wurzel Minderer

export default combineReducers({ 
 
    user, 
 
});

+0

sind all diese zusätzlichen Kommas und Ellipsen in der Bibliothek rectjs oder so? Ansonsten sieht es so aus, als wäre schlechtes JavaScript dein Täter. – Matt

+1

nah bro: D I'ts airbnb reagieren eslint config. Ich bekomme Fehler ohne dieses Komma –

Antwort

0

Wenn dieses Minderer sollte den Zustand der vollständigen Darstellung des neuen Benutzers aktualisieren (und alte Daten verwerfen) sollten Sie nur die neue zurückkehren Benutzer als Status.

Können Sie das folgende Foto machen?

export default function user(state = {}, action) { 
 
    switch (action.type) { 
 
    case GET_USER_SUCCESS: 
 
     return action.user; 
 
    case GET_USER_FAILURE: 
 
     return { 
 
     ...state, 
 
     error: action.error, 
 
     }; 
 
    default: 
 
     return state; 
 
    } 
 
}

+1

ja, es funktioniert. Vielen Dank –

+0

Ich stimme dieser Antwort nicht zu, da es keine Eigenschaften aus dem Ausgangszustand zurückgibt, und wenn das Objekt, das Sie von der Aktion erhalten, keine Eigenschaften des vorherigen Status des Benutzers Reduzierer enthält, ändern Sie die Form von das Objekt in einer Weise, die Sie vielleicht nicht erwarten. Dies kann zu Fehlern in Ihren verbundenen Komponenten führen, wenn die Attribute, die Sie voraussichtlich definieren, plötzlich undefiniert sind. Ich würde es vorziehen, den Spread-Operator oder die Objekt-Zuweisung zu verwenden, um den vorherigen Zustand mit der Nutzlast der Aktion zu kombinieren. –

+0

@YoWakita - Ich stimme nicht zu, aber es hängt alles vom Anwendungsfall ab. Wenn Sie einen Benutzer verfolgen, der ausgeloggt und als separater Benutzer angemeldet ist, warum sollten die Eigenschaften des alten Benutzers im Status verbleiben? – cchamberlain

2

Sie benötigen die Daten zu verbreiten, die für Benutzer kommt, keine Notwendigkeit, es zu user zuweisen. Ihr Minderer ist in bereits

case GET_USER_SUCCESS: 
 
    return { 
 
    ...state, 
 
    ...action.user 
 
    };

+0

Dieser Fall funktioniert nur mit einem einzelnen Benutzerobjekt. Wenn ich das mit einem Array von Benutzern versuche, dann wird das Array zerstört –

0

Gemessen an diesem Zitat

Wenn ich das der Benutzer mit Array versuchen werden, dann wird Array

zerstört werden Warum nicht Object.assign() verwenden?

return Object.assign({}, state, {user: [...state.user, ...action.user]}) 

Angenommen, dass mehrere Benutzer eine Möglichkeit ist, warum nicht nur die Benutzereigenschaft in Ihrem Zustand als ein Array beibehalten?

+0

Ich muss nur 2 Aktionen machen. Zuerst wird ein einzelnes Benutzerobjekt von einer API und die zweite erhält ein Array von mehreren Benutzern von einer API und ich muss sie separat in dem Zustand speichern. –

+0

Wenn getrennt, dann zwei Eigenschaften verwenden oder wenn die API-Aufrufe nicht beziehen, dann würde ich vorschlagen, nur einen separaten Reducer verwenden, um das Array von Benutzern zu behandeln. –

Verwandte Themen