Повторите попытку для получения эффекта использования в React JS

#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’ и увеличить количество при нажатии кнопки повтора (и добавить его в массив зависимостей). Таким образом, вы также можете контролировать количество разрешенных трасс.