169 похожих чатов

Доброе утро, я новичок в React Передо мной стоит задача -

обработка ошибки 422 с сервера и отображение в UI.

Использую общий useApi с axios.

const [error, setError] = useState<ApiError | null>(null);

catch (error: unknown) {
if (error instanceof AxiosError && error.response) {
if (error.response.status === 401) {
localStorage.removeItem(LOCAL_STORAGE_TOKEN_KEY);
location.reload();
}

setError({ code: error.response.status, text: error.response.data.errors });
} else {
setError({ code: 520, text: 'an unexpected error occurred.' });
}
setData(null);
setIsLoading(false);
}

Вот мой код где я пытаюсь словить ошибку в state и потом передаю в другие компоненты.

Проблема в том что при первом вызове Api с ошибкой значение error равно null, при втором вызове Api setError отрабатывает нормально и мой error равен ошибке.

Я так понимаю проблема в асинхронностю в работе useState. Но чем его заменить в моей ситуации?

Буду благодарен за совет/помощь.

6 ответов

5 просмотров

Да тут все верно написано и не сказать что новичек. Стейт не асинхронный, у него такая реализация что изменения видны не сразу, забыл уже как это все называется. Тебе надо просто правильно выводить ошибку на экран

Sultan- Автор вопроса
Максим
Да тут все верно написано и не сказать что новичек...

Правильно ошибку на экран не выведу, поскольку получу null от useApi Замкнутый круг выходит 😄

Sultan
Правильно ошибку на экран не выведу, поскольку пол...

Покажи полностью свой компонент с запросом и ретурном jsx

Sultan- Автор вопроса

Он довольно большой const handleSubmit = async (values: FormValues) => { let orgName = ''; let orgNumber = ''; if (enterpriseInfo && !enterpriseInfo.id) { orgName = enterpriseInfo.name || ''; orgNumber = enterpriseInfo.orgNumber || ''; } const payload = { firstName: values.firstName, lastName: values.lastName, phoneCode: selectedPhoneCode?.key || '', phoneNumber: values.phoneNumber, email: values.email, enterpriseId: enterpriseInfo?.id || null, createEnterprise: { orgName: orgName, orgNumber: orgNumber, }, type: customerType, }; const response = await createCustomerRequest.execute( ${process.env.REACT_APP_API_BASE_URL}/v1/customer, 'POST', { customer: payload, generateAndSendPassword: sendPassword, }, ); if (createCustomerRequest.error) { const errorText = createCustomerRequest.error.text; setErrors({ firstName: errorText?.firstName?.[0] || '', lastName: errorText?.lastName?.[0] || '', phoneCode: errorText?.phoneCode?.[0] || '', phoneNumber: errorText?.phoneNumber?.[0] || '', email: errorText?.email?.[0] || '', customerType: errorText?.type?.[0] || '', }); } if (response && response.customer) { setUserId(response.customer.uid); setPersonId(response.customer.personId); setFirstName(values.firstName); setLastName(values.lastName); setSubmissionStatus('success'); } }; Это отправка формы на бек, по клику кнопки. <TextField placeholder={intl.formatMessage({ id: translationKeys.create_customer_drawer_phone_placeholder, })} type="text" label={intl.formatMessage({ id: translationKeys.create_customer_drawer_phone_label, })} size="large" name="phoneNumber" onChange={handleChange} onBlur={handleBlur} value={values.phoneNumber} errorText={ (touched.phoneNumber ? errors.phoneNumber : undefined) || apiErrors.phoneNumber } data-testid="phone-number-input" /> И вот к примеру поле где я отображаю ошибку, в errorText передаю apiErrors.phoneNumber Но этот блок не отработает, if (createCustomerRequest.error) поскольку createCustomerRequest.error === null

Sultan
Он довольно большой const handleSubmit = async (v...

Залей в сандбокс тогда чтоли

location.reload Умер

Похожие вопросы

Обсуждают сегодня

Какой-то там пердун в 90-х решил, что есть какая-то разная типизация. Кого вообще это волнует?
КТ315
49
void terminal_scroll() { memmove(terminal_buffer, terminal_buffer + VGA_WIDTH, buffer_size - VGA_WIDTH); memset(terminal_buffer + buffer_size - VGA_WIDTH, 0, VGA_WIDTH); ...
Егор
47
Всем привет! Подскажите, пожалуйста, в чем ошибка? Настраиваю подключение к MySQL. Либы лежат рядом с exe. Все как по "учебнику"
Евгений
16
А можете как-то проверить меня по знаниям по ассемблеру?
A A
132
Здравствуйте! У меня появилась возможность купить книгу "Изучай Haskell во имя добра!". Но я где-то слышал, что эта книга устарела. Насколько это правда??
E
22
Здравствуйте! Я вот на stepic решаю задачи на хаскеле https://stepik.org/lesson/8443/step/8?unit=1578 мой код import Data.List (isInfixOf) removing :: String -> [String] ->...
E
10
Камрады, кто тесно работал с vtv, хотел уточнить. Ширина column задаётся жёстко на этапе создания дерева или можно в рантайме ее менять программно (не мышкой)?
Ed Doc
10
да ладно ... что там неочевидного ? глянуть в исх-ки датасета и/или кверика чтобы понять в каком месте и как выполняется обращения к св-вам blablaSQL - минутное дело, даже е...
Сергей
7
Здесь для arm кто-нибудь кодит ?
Nothing
52
Всем привет, у меня есть сервер принимающий входящие HTTP подключения, как проверить, что подключение было через прокси или нет, есть какие то поля в заголовках по которым мо...
DS
8
Карта сайта