Pytanie pewnie banalne, ale ja dopiero zaczynam reduxa, a dokumentacja poświęca dwa zdania: czy to co zwraca ta funkcja jest 'oderwane' od store (w tym sensie, że można to modyfikować, nie wywołując mutacji store)?
Dlaczego tego nie sprawdzisz, tj. nie zmienisz czegoś testowo:
store.getState().foo = 123;
if(store.getState().foo == 123) throw new Error("Nie rób tak");
Jak widać na przykładzie mutujesz stan, czyli nie powinieneś tak robić: https://codesandbox.io/s/redux-example-bhz5f
Zresztą gdyby getState zwracało ci kopię stanu za każdym razem, to by było bez sensu*, bo traciłbyś jedną z zalet niemutowalności, jaką jest szybkie porównanie czy obiekt nie posiada jakichś głębokich zmian za pomocą zwykłego ===
- no bo jeśli coś się zmieniło w środku, to będzie już inny obiekt. A jeśli jest robiona kopia, to zawsze będzie !==
:( )
Jednak nasuwa mi się pytanie - co ty chcesz dokładnie zrobić? Do czego potrzebujesz to, co ci się wydaje, że potrzebujesz?
Mam wrażenie, że to ten przypadek https://typeofweb.com/2019/05/31/problem-xy-czyli-gdy-nie-wiemy-o-co-pytamy/
* tak samo bez sensu postępują ludzie, którzy kopiują cały stan w reducerze, działają na kopii i za każdym razem zwracają kopię całego stanu. Na tym etapie można po prostu przestać używać Reduxa i poszukać mutowalnego zarządzania stanem (np. Mobx).. Ew. poszukać dobrej biblioteki do niemutowalności, np. Transmutable czy Immer
Przy okazji inne pytanie — czy reducer może przyjmować event jak actions.payload do dalszej obróbki?
To rodziłoby problemy:
- Nie jestem pewien, czy eventy się serializują w prosty sposób do JSON, a serializowanie akcji może być pomocne, np. do nagrywania stanu i odtwarzania go później.
- (o ile używasz Reacta) React daje ci fejkowe eventy, które się potem i tak zmutują (chyba, że wywołasz metodę
persist
https://reactjs.org/docs/events.html
- zasada najmniejszego uprzywilejowania - po co reducer ma wiedzieć o obiektach event? Owszem, taki reducer byłby bardziej potężny i pewnie wygodniej by się pisało, jednak taki kod byłby mniej przenośny, uzależniałbyś reducera od eventów przeglądarkowych (a powiedzmy, że chcesz odpalić akcję poza eventem - to co robisz? Musiałbyś utworzyć samodzielnie taki pseudoevent, ew. po prostu obiekt, który by emulował eventa. Więc na dłuższą metę byłoby to upierdliwe).