Chciałbym, aby moje oparte na React SPA renderowało po stronie serwera (kto nie jest w tych dniach). Dlatego chcę połączyć React z react-router, redux i niektórymi warstwami kompilacji, takimi jak isomorphic starterkit.Jak logicznie połączyć router reagujący i redux do renderowania po stronie klienta i po stronie serwera?
Istnieje hapi universal redux, który łączy wszystko razem, ale ja zmagaję się z tym, jak zorganizować mój przepływ. Moje dane pochodzą z wielu punktów końcowych interfejsu REST API. Różne komponenty mają różne potrzeby w zakresie danych i powinny ładować dane dokładnie w czasie na kliencie. Zamiast tego na serwerze należy pobrać wszystkie dane dla określonej trasy (zestawu komponentów) i niezbędne komponenty wyrenderowane na łańcuchy.
W moim pierwszym podejściu użyłem oprogramowania pośredniego redux do tworzenia asynchronicznych akcji, które ładują dane, zwracają obietnicę i uruchamiają akcję SOME_DATA_ARRIVED
, gdy obietnica się rozwiązuje. Reducers następnie aktualizuje mój sklep, komponenty ponownie renderują, wszystko dobrze. Zasadniczo to działa. Ale potem uświadomiłem sobie, że przepływ staje się niezręczny, w momencie rozpoczęcia rutowania.
Niektóre komponenty, które wymieniają wiele rekordów danych, mają wiele linków do filtrowania rekordów. Każdy filtrowany zestaw danych powinien być dostępny pod własnym adresem URL, takim jak /filter-by/:filter
. Używam różnych komponentów <Link to={...}>
, aby zmienić adres URL kliknięcia i uruchomić router. Router powinien zaktualizować sklep zgodnie ze stanem reprezentowanym przez bieżący adres URL, co z kolei powoduje ponowne renderowanie odpowiedniego komponentu.
To nie jest łatwe do osiągnięcia. Najpierw wypróbowałem componentWillUpdate
, aby uruchomić akcję, która asynchronicznie wczytała moje dane, zapełniła magazyn i spowodowała kolejny cykl ponownego renderowania dla mojego komponentu. Ale to nie działa na serwerze, ponieważ obsługiwane są tylko trzy metody cyklu życia.
Poszukuję odpowiedniego sposobu na uporządkowanie tego. Interakcje użytkowników z aplikacją, które zmieniają stan aplikacji z perspektywy użytkowników, powinny aktualizować adres URL. IMO powinno to spowodować, że router w jakiś sposób załaduje niezbędne dane, zaktualizuje sklep i rozpocznie proces uzgadniania.
Tak interaction -> URL change -> data fetching -> store update -> re-render
.
To podejście powinno działać również na serwerze, ponieważ z żądanego adresu URL powinno być możliwe określenie danych do załadowania, wygenerowanie initial state
i przekazanie tego stanu do generowania redux store
. Ale nie znajduję sposobu, aby to właściwie zrobić. Tak więc dla mnie powstają następujące pytania:
- Czy moje podejście jest złe, ponieważ istnieje coś, czego jeszcze nie rozumiem/nie wiem?
- Czy dobrze jest zachować dane załadowane z REST API's w redux's
store
? - Czy to nie jest niezręczne mieć komponenty, które utrzymują
state
w reduxiestore
i innych zarządzających swoimistate
przez siebie? - Czy pomysł, aby
interaction -> URL change -> data fetching -> store update -> re-render
był po prostu zły?
Jestem otwarty na wszelkiego rodzaju sugestie.