store.getState() czy wynik tej funkcji jest oderwany od store?

0

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)?

Przy okazji inne pytanie — czy reducer może przyjmować event jak actions.payload do dalszej obróbki? Tak naprawdę chodzi mi o to, czy bardziej złożoną obróbkę zdarzenia można zmieścić w jednym miejscu (reducer przy złożeniu jak wyżej) czy trzeba ją jednak podzielić i jako payload wysłać coś bardziej standardowego (string, tabelę, obiekt)? Nie znalazłem w dokumentacji nic, co by tego wzbraniało, jednak wolałbym się upewnić.

1
Krajeski napisał(a):

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:

  1. 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.
  2. (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
  3. 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).
0

Dzięki. Odnośnie 1 to faktycznie znalazłem rozwiązanie 5 minut po publikacji. Krótko mówiąc, w reducerze chciałem w ten sposób pobrać fragment stanu (nie śmiejcie się, toć pisałem, że to moje poczatki). A odnośnie 2 - dzięki, sprawa jasna, też nie byłem przekonany.

1 użytkowników online, w tym zalogowanych: 0, gości: 1