Я бы сказал, что ни одна из ваших первоначальных идей не отражает всю картину. Идея 1 это просто обратный звонок. Если вы хотите использовать функцию обратного вызова: useCallback
. Идея 2 будет работать и предпочтительнее, если вам не нужно использовать излишек. Иногда вам лучше использовать редукс. Возможно, вы устанавливаете валидность формы, проверяя, что ни в одном из полей ввода нет ошибок или чего-то подобного. Поскольку мы говорим о редуксе, давайте предположим, что это так.
Обычно лучший подход к обработке ошибок с помощью приставки - это иметь поле ошибки в состоянии, которое затем передается компоненту ошибки.
const ExampleErrorComponent= () => {
const error = useSelector(selectError);
if (!error) return null;
return <div className="error-message">{error}</div>;
}
Компонент error не должен просто отображать ошибку, он также может вызывать побочные эффекты useEffect
.
То, как ошибка установлена / не установлена, зависит от вашего приложения. Давайте использовать ваш пример номера телефона.
1. Если проверка достоверности является чистой функцией, это можно сделать в редукторе.
Затем вы должны установить или сбросить поле ошибки в ответ на действия по изменению номера телефона. В редукторе, построенном с оператором switch, это может выглядеть следующим образом.
case 'PHONE_NUMBER_CHANGE':
return {
...state,
phoneNumber: action.phoneNumber,
error: isValidPhoneNumber(action.phoneNumber) ? undefined : 'Invalid phone number',
};
2. Если серверная часть сообщает об ошибках, отправьте действия по обработке ошибок.
Допустим, вы отправляете номер телефона бэкэнду, который выполняет проверку перед тем, как что-то сделать с номером. Вы не можете знать, действительны ли данные на стороне клиента. Вам просто нужно поверить слову сервера.
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],
);
Затем редуктор должен создать соответствующее сообщение об ошибке и установить его.
Не забудьте сбросить ошибку. Вы можете сбросить ошибку при изменении действия или при выполнении другого запроса в зависимости от приложения.
Два подхода, которые я изложил, не являются взаимоисключающими. Первое можно использовать для отображения локально обнаруживаемых ошибок, а также второе для отображения ошибок на стороне сервера или сети.