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