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