2017-10-17 1 views
1

Cela devrait être simple mais je ne trouve pas la réponse simple que je veux. J'ai un réducteur:Mettre à jour l'objet tableau dans React Redux réducteur

const posts = (state = null, action) => { 
    switch(action.type){ 
    case "PUBLISH_POST": 
     return state; 
    case "UNPUBLISH_POST": 
     return state; 
    default: 
     return postList; 
    } 
} 

J'ai une liste des postes avec ID « s et un status. J'envoie mon ID de poste, mais je n'arrive pas à comprendre la logique pour mettre simplement à jour le status de 0 à 1 pour l'article qui a été cliqué. J'ai trouvé beaucoup de demi-solutions mais elles semblent toutes verbeuses et laides - quel est le moyen le plus court/le meilleur de l'atteindre dans ce cas?

données Exemple:

{ 
    id:1, 
    user:"Bob Smith", 
    content:"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque vulputate mauris vitae diam euismod convallis. Donec dui est, suscipit at dui vitae, sagittis efficitur turpis. ", 
    status:1 
} 
+0

Comment ressemblez-vous? Est-ce un tableau de messages? – mersocarlin

+0

@mersocarlin oui, exemple ci-dessus –

+0

Quelle est la charge utile de l'action? – Jaxx

Répondre

2

En supposant que votre action est quelque chose comme:

{ 
    type: 'UNPUBLISH_POST', 
    payload: { 
    id: 1, 
    user: 'Bob Smith', 
    content: 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque vulputate mauris vitae diam euismod convallis. Donec dui est, suscipit at dui vitae, sagittis efficitur turpis. ', 
    status: 1 
    } 
} 

Utilisez simplement spread operator pour elle:

const posts = (state = null, action) => { 
    switch(action.type){ 
    case "PUBLISH_POST": 
    case "UNPUBLISH_POST": 
     const index = this.state.findIndex(post => post.id === action.payload.id) 

     return [ 
      ...state.slice(0, index), // everything before current post 
      { 
       ...state[index], 
       status: action.type === 'PUBLISH_POST' ? 1 : 0, 
      }, 
      ...state.slice(index + 1), // everything after current post 
     ] 
    default: 
     return postList; 
    } 
} 
+0

Merci. J'ai dû enlever "ceci". de l'état. Je réalise que je ne peux pas faire une bascule aussi bien que deux conditions. –

+0

@MattSaunders vous êtes les bienvenus. Je viens de remarquer que votre 'state' par défaut est' null'. Peut-être l'initialiser comme un tableau vide afin que vous n'ayez pas de problèmes futurs avec lui :) – mersocarlin

+0

Vous pouvez également envisager d'utiliser le module [immutability-helper] (https://github.com/kolodny/immutability-helper) avec le modèle décrit [ici] (https://stackoverflow.com/questions/40276907/updating-the-array-object-in-react-state-using-immutability-helper). –

1

Une solution plus générale, en particulier si l'état contient autres données en plus de votre tableau posts:

const posts = (state = null, action) => { 
    const post = state.posts.find(p => p.id === action.payload.id); 
    switch(action.type) { 
    case "PUBLISH_POST": 
     return { ...state, posts: [ ...state.posts.filter(p => p === post), { ...post, status: 1 } ] }; 
    case "UNPUBLISH_POST": 
     return { ...state, posts: [ ...state.posts.filter(p => p === post), { ...post, status: 0 } ] }; 
    default: 
     return state; 
    } 
}