2016-06-12 23 views
6

Mi chiedo se potresti aiutarmi con questo problema se possibile. Sto tentando di eliminare un elemento dallo stato di Redux. Ho passato l'ID dell'articolo che l'utente fa clic su action.data nel riduttore.Elimina un elemento dallo stato Redux

Mi chiedo come posso abbinare il action.data con uno degli ID all'interno dello stato Redux e quindi rimuovere quell'oggetto dall'array? Mi sto anche chiedendo il modo migliore per impostare il nuovo stato dopo che il singolo oggetto è stato rimosso?

prega di consultare il codice qui sotto:

export const commentList = (state, action) => { 
    switch (action.type) { 
    case 'ADD_COMMENT': 
     let newComment = { comment: action.data, id: +new Date }; 
     return state.concat([newComment]); 
    case 'DELETE_COMMENT': 
     let commentId = action.data; 

    default: 
     return state || []; 
    } 
} 

risposta

41

Basta filtrare i commenti:

case 'DELETE_COMMENT': 
    const commentId = action.data; 
    return state.filter(comment => comment.id !== commentId); 

In questo modo non sarà possibile mutare il state matrice originale, ma restituisce un nuovo array senza l'elemento, che aveva l'id commentId.

Per essere più concisa:

case 'DELETE_COMMENT': 
    return state.filter(({ id }) => id !== action.data); 
+0

ho visto un altro esempio che ha usato proprio id, al contrario di vostra risposta ({id}). qual è il diverso qui? –

+0

@MattSaunders '({id}) => ...' è un'espressione lambda (funzione di freccia in termini js), che destruttura il suo argomento. Significa che l'input dovrebbe essere un oggetto, e noi siamo interessati solo alla sua proprietà 'id'. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment –