Mam problem polegający na tym, że ponowne renderowanie stanu powoduje problemy z interfejsem użytkownika i zasugerowano, aby zaktualizować tylko określoną wartość w moim reduktorze, aby zmniejszyć ilość ponownego renderowania na stronie.
to jest przykład mojego stanu
{
name: "some name",
subtitle: "some subtitle",
contents: [
{title: "some title", text: "some text"},
{title: "some other title", text: "some other text"}
]
}
i obecnie aktualizuję to w ten sposób
case 'SOME_ACTION':
return { ...state, contents: action.payload }
gdzie action.payload
jest całą tablicą zawierającą nowe wartości. Ale teraz muszę tylko zaktualizować tekst drugiej pozycji w tablicy content, a coś takiego nie działa
case 'SOME_ACTION':
return { ...state, contents[1].text: action.payload }
gdzie action.payload
jest teraz tekst, którego potrzebuję do aktualizacji.
javascript
reactjs
redux
Ilja
źródło
źródło
kolodny/immutability-helper
, więc teraz jestyarn add immutability-helper
iimport update from 'immutability-helper';
Możesz użyć
map
. Oto przykładowa realizacja:źródło
Nie musisz robić wszystkiego w jednej linii:
źródło
Bardzo późno na imprezę, ale tutaj jest ogólne rozwiązanie, które działa z każdą wartością indeksu.
Tworzysz i rozprzestrzeniasz nową tablicę od starej do tej,
index
którą chcesz zmienić.Dodaj żądane dane.
Utwórz i rozprowadź nową tablicę od tej,
index
którą chciałeś zmienić, do końca tablicyAktualizacja:
Zrobiłem mały moduł, aby uprościć kod, więc wystarczy wywołać funkcję:
Więcej przykładów znajdziesz w repozytorium
podpis funkcji:
źródło
Wierzę, że kiedy potrzebujesz tego rodzaju operacji na swoim stanie Redux, operator spreadu jest twoim przyjacielem i ta zasada dotyczy wszystkich dzieci.
Udawajmy, że to twój stan:
I chcesz dodać 3 punkty do Ravenclaw
Używając operatora spreadu, możesz zaktualizować tylko nowy stan, pozostawiając wszystko inne nienaruszone.
Przykład zaczerpnięty z tego niesamowitego artykułu , możesz znaleźć prawie każdą możliwą opcję ze świetnymi przykładami.
źródło
W moim przypadku zrobiłem coś takiego, bazując na odpowiedzi Luisa:
źródło
Tak to zrobiłem dla jednego z moich projektów:
źródło
Obawiam się, że użycie
map()
metody tablicowej może być kosztowne, ponieważ cała tablica ma być iterowana. Zamiast tego łączę nową tablicę, która składa się z trzech części:Oto przykład, którego użyłem w moim kodzie (NgRx, ale machanizm jest taki sam dla innych implementacji Redux):
źródło