Mam jeden reduktor dla Klientów, drugi dla AppToolbar i kilka innych ...
Teraz powiedzmy, że utworzyłem akcję pobierania, aby usunąć klienta, a jeśli to się nie powiedzie, mam kod w reduktorze klientów, który powinien coś zrobić, ale chcę również wyświetlić jakiś globalny błąd w AppToolbar.
Ale Klienci i reduktory AppToolbar nie mają tej samej części stanu i nie mogę utworzyć nowej akcji w reduktorze.
Jak więc mam pokazać błąd globalny? Dzięki
AKTUALIZACJA 1:
Zapomniałem wspomnieć, że używam este devstack
AKTUALIZACJA 2: Oznaczyłem odpowiedź Erica jako poprawną, ale muszę powiedzieć, że rozwiązanie, którego używam z szacunkiem, jest bardziej jak połączenie odpowiedzi Erica i Dana ... Po prostu musisz znaleźć to, co najlepiej pasuje do twojego kodu. .
źródło
Odpowiedzi:
Jeśli chcesz mieć pojęcie „błędów globalnych”, możesz utworzyć
errors
reduktor, który może nasłuchiwać akcji addError, removeError, itp. Następnie możesz podłączyć się do swojego drzewa stanu Redux pod adresemstate.errors
i wyświetlać je w odpowiednim miejscu.Istnieje wiele sposobów rozwiązania tego problemu, ale ogólna idea jest taka, że globalne błędy / komunikaty zasługują na to, by ich własny reduktor działał całkowicie niezależnie od
<Clients />
/<AppToolbar />
. Oczywiście, jeśli którykolwiek z tych elementów wymaga dostępu,errors
możesz przekazaćerrors
je jako rekwizyt, gdy zajdzie taka potrzeba.Aktualizacja: przykład kodu
Oto jeden przykład tego, jak mogłoby to wyglądać, gdybyś przekazał „błędy globalne”
errors
na najwyższy poziom<App />
i warunkowo je wyrenderował (jeśli występują błędy). Korzystanie z React-Reduxconnect
do połączenia<App />
komponentu z niektórymi danymi.A jeśli chodzi o twórcę akcji, spowodowałoby to ( redux-thunk ) niepowodzenie sukcesu zgodnie z odpowiedzią
Chociaż twój reduktor może po prostu zarządzać szeregiem błędów, odpowiednio dodając / usuwając wpisy.
źródło
catch
wywołania funkcji, jeślisomeHttpClient.get('/resources')
lubfetch('/resources')
których używam w moim zwrocie kodu500 Server Error
. Czy masz jakieś myśli na czubku głowy, w których mógłbym popełnić błąd? Zasadniczo to, co robię, tofetch
wysłanie żądania, które kończy się na my, wroutes
którym wywołuję metodę na moimmongoose
modelu, aby zrobić coś bardzo prostego, na przykład dodanie tekstu lub usunięcie tekstu z bazy danych.Odpowiedź Erika jest poprawna, ale chciałbym dodać, że nie musisz uruchamiać oddzielnych akcji, aby dodać błędy. Alternatywnym podejściem jest posiadanie reduktora, który obsługuje dowolną akcję z
error
polem . To kwestia osobistego wyboru i konwencji.Na przykład z przykładu Redux,
real-world
który ma obsługę błędów:źródło
error
do ładunku działania. Dzięki Dan!Podejście, które obecnie stosuję w przypadku kilku konkretnych błędów (sprawdzanie poprawności danych wejściowych użytkownika), polega na tym, że moje reduktory podrzędne zgłaszają wyjątek, przechwytują go w moim reduktorze głównym i dołączają go do obiektu akcji. Następnie mam sagę redux, która sprawdza obiekty akcji pod kątem błędu i aktualizuje drzewo stanu danymi o błędach w tym przypadku.
Więc:
A potem dodanie błędu do drzewa stanu jest zgodne z opisem Erika.
Używam go dość oszczędnie, ale dzięki temu nie muszę powtarzać logiki, która zgodnie z prawem należy do reduktora (dzięki czemu może chronić się przed nieprawidłowym stanem).
źródło
napisz niestandardowe oprogramowanie pośredniczące, aby obsłużyć wszystkie błędy związane z interfejsem API. W takim przypadku twój kod będzie bardziej przejrzysty.
źródło
if
w reduktorzeTo, co robię, to scentralizowanie całej obsługi błędów w efekcie na podstawie poszczególnych efektów
źródło
Możesz użyć klienta HTTP axios. Posiada już zaimplementowaną funkcję Interceptors. Możesz przechwytywać żądania lub odpowiedzi, zanim zostaną obsłużone do tego czasu lub złapać.
https://github.com/mzabriskie/axios#interceptors
źródło