2017-10-17 2 views
1

Dies sollte einfach sein, aber ich finde nicht die einfache Antwort, die ich will. Ich habe einen Druckminderer:Aktualisieren Array-Objekt in React Redux Reducer

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

Ich habe eine Liste der Beiträge mit ID ‚s und einem status. Ich sende meine Post-ID ein, kann aber die Logik nicht herausfinden, um einfach status von 0 auf 1 für das Element, auf das geklickt wurde, zu aktualisieren. Ich habe viele Halb-Lösungen gefunden, aber sie scheinen alle ausführlich und hässlich zu sein - was ist der kürzeste/beste Weg, um es in diesem Fall zu erreichen?

Beispieldaten:

{ 
    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

Wie sehen Sie aus? Ist es eine Reihe von Posts? – mersocarlin

+0

@mersocarlin ja, Beispiel oben –

+0

Was ist die Action-Payload? – Jaxx

Antwort

2

Ihre action Unter der Annahme, sind so etwas wie:

{ 
    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 
    } 
} 

einfach spread operator dafür verwenden:

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

Danke. Ich musste "das" entfernen. aus dem Staat. Mir ist klar, dass ich nicht einfach einen Wechsel machen kann, statt zwei Bedingungen. –

+0

@MattSaunders du bist willkommen. Ich habe gerade festgestellt, dass Ihr 'state' standardmäßig auf 'null' steht. Vielleicht initialisieren Sie es als ein leeres Array, damit Sie keine zukünftigen Probleme damit haben :) – mersocarlin

+0

Sie könnten auch das Modul [immutability-helper] (https://github.com/kolodny/immutability-helper) zusammen mit dem verwenden Muster beschrieben [hier] (https://stackoverflow.com/questions/40276907/updating-the-array-object-in-react-state-using-immutability-helper). –

1

Eine allgemeine Lösung, vor allem, wenn Zustand enthält andere Daten neben Ihrem posts Array:

Verwandte Themen