#javascript #reactjs
#javascript #reactjs
Вопрос:
У меня есть функциональный компонент, который извлекает некоторые данные из API и показывает их где-нибудь на странице, дело в том, что при возникновении ошибки я хочу отобразить кнопку повтора, чтобы снова вызвать API. итак, я сделал это:
import React, {useEffect, useState} from "react";
import api from "../../../api";
import {useSnackbar} from "notistack";
const ShowPassword = ({uuid}) => {
const [password, setPassword] = useState(null);
const [retry, setRetry] = useState(false);
const {enqueueSnackbar} = useSnackbar();
useEffect(() => {
api.showPassword(uuid)
.then(res => {
setPassword(res.data.password);
})
.catch(err => {
setRetry(true);
enqueueSnackbar('An error occured...', {variant: 'error'});
})
}, [password]);
return (
<div>
{
retry
? <button onClick={() => {
setRetry(false);
setPassword(null);
}} type='button'>Retry</button>
: <span>{password ?? 'Loading...'}</span>
}
</div>
);
};
export default ShowPassword;
но при нажатии на кнопку Повторить попытку она отображается Loading...
, но API больше вызываться не будет.
Комментарии:
1. Массив зависимостей useEffect [пароль] не изменился в сценарии ошибки. Нужно добавить сюда какой-нибудь «change var»?
Ответ №1:
в случае ошибки значение «пароль» не изменилось. Добавьте некоторое значение к паролю (или какое-либо изменение для указания в массиве зависимостей useEffect).
onClick={() => {
setRetry(false);
setPassword("some value");
}}
Комментарии:
1. Можно ли в любом случае снова присвоить значение null
password
, но react находит его как другое значение и повторно отображает компонент? Или, может быть, есть способ сообщить react, что это состояние изменилось, что-то вроде принудительного изменения состояния2. @Omid, я думаю, вы можете добавить SetPassword (null) непосредственно перед вызовом api в use effect. В качестве альтернативы предлагаемому исправлению вы можете сохранить новую переменную состояния ‘retryCount’ и увеличить количество при нажатии кнопки повтора (и добавить его в массив зависимостей). Таким образом, вы также можете контролировать количество разрешенных трасс.