Здесь, даже если вы устанавливаете состояние с его собственным значением, когда useEffect завершает работу, оно думает, что вы обновили состояние с новым значением, так как data.currencies будут установлены во время использования useEffect, это вызывает цикл при добавлении его какзависимость.
Если вы хотите сохранить код как есть, вы можете добавить // eslint-disable-next-line
к строке ранее.
Причина: в этом случае вы знаете, что не хотите запускать этот useEffect при изменении data.currencies (так как в этом смысл этого useEffect)
Другой вариант, поскольку вына самом деле пытаются перевести валюты в состояние загрузки. Вы можете просто изменить:
setData({currencies: data.currencies, isFetching: true});
-and-
setData({currencies: data.currencies, isFetching: false});
на:
setData({isFetching: true});
-and-
setData({isFetching: false});
(Имейте в виду, что setState не является немедленным, как установленосостояние переходит в очередь JavaScript, поэтому лучше не полагаться на это)
Полный (слегка измененный оператор возврата) рабочий код:
import React, {useEffect, useState} from 'react';
import ReactDOM from 'react-dom'
const Slide = () => {
const [id, setId] = useState(0);
const [data, setData] = useState({currencies:[], isFetching:false});
const images = [
"https://images.pexels.com/photos/672532/pexels-photo-672532.jpeg?auto=compress&cs=tinysrgb&dpr=2&h=650&w=940",
"https://images.pexels.com/photos/773471/pexels-photo-773471.jpeg?auto=compress&cs=tinysrgb&dpr=2&h=650&w=940",
"https://images.pexels.com/photos/64271/queen-of-liberty-statue-of-liberty-new-york-liberty-statue-64271.jpeg?auto=compress&cs=tinysrgb&dpr=2&h=650&w=940"
];
useEffect(()=> {
const getCurrentCurrency = async () => {
try{
setData({isFetching: true});
const currencyArr = [];
const response = await fetch(`https://api.exchangeratesapi.io/latest?base=GBP`);
const responseData = await response.json();
const {EUR:euro ,CHF:franc, USD: dolar} = responseData.rates;
currencyArr.push(euro,franc,dolar);
setData({currencies: currencyArr, isFetching: false});
}
catch (e) {
setData({isFetching: false});
}
};
getCurrentCurrency();
}, [id]);
const goToPrevSlide = () => {
id === 0 ? setId(2) : setId(id-1);
}
const goToNextSlide = () =>{
id === 2 ? setId(0) : setId(id+1);
}
return(
<div>
<div className="slide">
<div>
{id}
</div>
{JSON.stringify(data)}
<div>
<button onClick={goToPrevSlide}>Prev</button>
<button onClick={goToNextSlide}>Next</button>
</div>
</div>
</div>
);
}