2016-10-27 17 views
12

Aktualizuję obiekt w tablicy w stanie React, używając immutability helper.Aktualizowanie obiektu tablicy w stanie Reagowania za pomocą pomocnika niezmienności

Przedmiotem że do modyfikacji jest zagnieżdżony:

this.state = { 
    a: { 
    b: [{ c: '', d: ''}, ...] 
    } 
} 

I Aby zaktualizować podpory C w n-tego elementu b, stosując niezmienność pomocnika.

Odpowiednik kodu bez pomocnika niezmienność jest:

const newState = Object.assign({}, this.state); 
newState.a = Object.assign({}, newState.a); 
newState.a.b = newState.a.b.slice(); 
newState.a.b[n] = Object.assign({}, newState.a.b[n]); 
newState.a.b[n].c = 'new value'; 
this.setState({ newState }); 

wiem powyższy kod jest nieco brzydki. Zakładam, że kod wykorzystujący pomocnika niezmienności rozwiąże mój problem. Dzięki

+1

Rozważ użycie ImmutableJS. –

Odpowiedz

15

Jednym ze sposobów byłoby korzystania $set

let index = 0; 
let newState = update(this.state, { 
    a: { 
    b: { 
     [index]: { 
       c: { $set: "new value"} 
     } 
    } 
    } 
}); 
this.setState(newState); 

jsfiddle

+0

Czy aktualizacja zwraca nowy obiekt/element, taki jak abc = Object.assign ({}, xyz) lub zmienia obiekt podany jako parametr w miejscu? –

+0

@VrajSolanki Dla tego przykładu, zwróci on nowy obiekt stanu, z nowym obiektem 'a' (klucze reszta są takie same, stare odwołania), z nową tablicą' b' w tym, wszystkie refreny elementów nie będą zmienione, ale ' [indeks] 'jeden. A z nowym odnośnikiem dla "c", reszta będzie starymi referencjami. – Wish

2

Im importowania update od niezmienności pomocnika tutaj :)

this.state = { 
    a: { 
    b: [{ c: '', d: ''}, ...] 
    } 
} 


this.setState(update(this.state, { 
    a: { 
     b: { 
      $apply: b => b.map((item, ii) => { 
       if(ii !== n) return item; 
       return { 
        ...item, 
        c: 'new value' 
       } 
      }) 
     } 
    } 
})