Powiedziałbym, że żaden z twoich początkowych pomysłów nie oddaje całego obrazu. Pomysł 1 to tylko oddzwonienie. Jeśli chcesz użyć wywołania zwrotnego: useCallback
. Pomysł 2 będzie działał i jest lepszy, jeśli nie musisz używać redux. Czasami lepiej jest użyć redux. Może ustawiasz ważność formularza, sprawdzając, czy żadne z pól wejściowych nie zawiera błędów lub czegoś podobnego. Ponieważ zajmujemy się redux, załóżmy, że tak jest.
Zwykle najlepszym podejściem do obsługi błędów z redux jest posiadanie pola błędu w stanie, które jest następnie przekazywane do składnika błędu.
const ExampleErrorComponent= () => {
const error = useSelector(selectError);
if (!error) return null;
return <div className="error-message">{error}</div>;
}
Składnik błędu nie musi tylko wyświetlać błędu, może również powodować działania niepożądane useEffect
.
Sposób ustawienia / wyłączenia błędu zależy od aplikacji. Użyjmy twojego numeru telefonu.
1. Jeśli kontrola ważności jest funkcją czystą, można to zrobić w reduktorze.
Następnie należy ustawić lub rozbroić pole błędu w odpowiedzi na działania zmiany numeru telefonu. W reduktorze zbudowanym z instrukcji switch może to wyglądać tak.
case 'PHONE_NUMBER_CHANGE':
return {
...state,
phoneNumber: action.phoneNumber,
error: isValidPhoneNumber(action.phoneNumber) ? undefined : 'Invalid phone number',
};
2. Jeśli backend zgłasza błędy, wyślij akcje błędów.
Powiedzmy, że wysyłasz numer telefonu do wewnętrznej bazy danych, która sprawdza, zanim coś zrobi z tym numerem. Nie możesz wiedzieć, czy dane są prawidłowe po stronie klienta. Musisz po prostu uwierzyć na słowo serwera.
const handleSubmit = useCallback(
() => sendPhoneNumber(phoneNumber)
.then(response => dispatch({
type: 'PHONE_NUMBER_SUBMISSION_SUCCESS',
response,
}))
.catch(error => dispatch({
type: 'PHONE_NUMBER_SUBMISSION_FAILURE',
error,
})),
[dispatch, phoneNumber],
);
Reduktor powinien następnie wyświetlić odpowiedni komunikat o błędzie i ustawić go.
Nie zapomnij usunąć błędu. Możesz usunąć błąd podczas akcji zmiany lub przy kolejnym żądaniu, w zależności od aplikacji.
Dwa przedstawione przeze mnie podejścia nie wykluczają się wzajemnie. Możesz użyć pierwszego, aby wyświetlić wykrywalne lokalnie błędy, a także drugiego, aby wyświetlić błędy po stronie serwera lub sieci.