2016-02-25 7 views
30

ich ein Problem habe, wo erneutes Rendern von Staat ui Themen verursacht und vorgeschlagen wurde, nur bestimmten Wert in meinem Minderer aktualisieren Menge des Re-Rendering auf einer Seite zu reduzieren.Wie in einzelnen Wert innerhalb spezifischem Array-Elements aktualisieren redux

ist dieses Beispiel meines Staates

{ 
name: "some name", 
subtitle: "some subtitle", 
contents: [ 
    {title: "some title", text: "some text"}, 
    {title: "some other title", text: "some other text"} 
] 
} 

und ich bin zur Aktualisierung es wie dieses

case 'SOME_ACTION': 
    return { ...state, contents: action.payload } 

wo action.payload ist eine ganze Reihe neuer Werte enthält. Aber jetzt brauche ich eigentlich nur Text des zweiten Elements aktualisieren in Inhalt Array, und so etwas wie dies funktioniert nicht

case 'SOME_ACTION': 
    return { ...state, contents[1].text: action.payload } 

wo action.payload ist nun ein Text, den ich für die Aktualisierung benötigen.

Antwort

14

Sie könnten Obwohl ich Sie wahrscheinlich etwas mehr wie dies tun würde denken würde?

case 'SOME_ACTION': 
    return update(state, { 
    contents: { 
     [action.id]: { 
     text: {$set: action.payload} 
     } 
    } 
    }); 
+0

in der Tat, muss ich diese Helfer sind aus meinem Minderer irgendwie reagieren? – Ilja

+0

'Import-Update von 'reagieren-addons-update';' – Clarkie

+3

Obwohl das Paket 'Kolodny/Unveränderlichkeit-helper' bewegt hat, so jetzt ist es' Garn hinzufügen Unveränderlichkeit-helper' und 'Import-Update von 'Unveränderlichkeit-Helfer'; ' – SacWebDeveloper

4

Sie müssen nicht alles tun, was in einer Zeile: die React Immutability helpers

import update from 'react-addons-update'; 

// ...  

case 'SOME_ACTION': 
    return update(state, { 
    contents: { 
     1: { 
     text: {$set: action.payload} 
     } 
    } 
    }); 

verwenden

case 'SOME_ACTION': 
    const newState = { ...state }; 
    newState.contents = 
    [ 
     newState.contents[0], 
     {title: newState.contnets[1].title, text: action.payload} 
    ]; 
    return newState 
+0

Sie haben Recht, ich habe eine schnelle Lösung. BTW, ist das Array feste Länge? Und ist der Index, den Sie modifizieren möchten, auch fest? Der derzeitige Ansatz ist nur mit kleinen Arrays und mit festem Index möglich. – Kujira

+0

wickeln Sie Ihren Fallkörper in {}, da const Blockbereich ist. –

51

können Sie map verwenden. Hier ist eine Beispiel-Implementierung:

case 'SOME_ACTION': 
    return { 
     ...state, 
     contents: state.contents.map(
      (content, i) => i === 1 ? {...content, text: action.payload} 
            : content 
     ) 
    } 
+0

das ist, wie ich auch tue, ich bin nur nicht sicher, ob es ein guter Ansatz ist oder nicht, da ein neues Array Karte zurückkehren wird. Irgendwelche Gedanken? ja – Ventura

+0

@Ventura, es ist gut, weil es eine neue Referenz für das Array und ein einfaches neues Objekt für die eine Erstellung soll aktualisiert werden (und nur, dass man), das ist genau das, was Sie – ivcandela

+0

möchte ich denke, das beste aproach ist –

Verwandte Themen