【发布时间】:2019-10-20 17:34:53
【问题描述】:
useEffect 内部存在无限循环问题。我只想在 id 依赖项发生变化时发出新请求。当我不传递数据时,我遇到了setData 的问题。我的数据状态没有更新。当我将数据传递给依赖项时,我有一个无限循环。如何解决它以及为什么?
import React, {useEffect, useState} from 'react';
import LeftArrow from './LeftArrow';
import RightArrow from './RightArrow';
import SlideItem from './SlideItem';
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({currencies: data.currencies, isFetching: true});
console.log("data", data.isFetching);
const currencyArr = [];
const response = await fetch(`https://api.exchangeratesapi.io/latest?base=GBP`);
const responseData = await response.json();
console.log(responseData);
const {EUR:euro ,CHF:franc, USD: dolar} = responseData.rates;
currencyArr.push(euro,franc,dolar);
console.log(currencyArr);
setData({currencies: currencyArr, isFetching: false});
console.log("currencies", data);
}
catch (e) {
console.log(e);
setData({currencies: data.currencies, isFetching: false});
}
};
getCurrentCurrency();
}, [id]);
const goToPrevSlide = () => {
// id === 0 ? setId(2) : setId(id-1);
}
const goToNextSlide = () =>{
// id === 2 ? setId(0) : setId(id+1);
}
return(
<div className="slide">
<div className="slide-wrapper"
style={{
transform: `translateX(500px)`,
transition: 'transform ease-out 0.45s'
}}
>
{
currencies.map((currency, i, images) => (
<SlideItem currency={currency} key={i} imageUrl={images[i]} />
))
}
</div>
<LeftArrow
goToPrevSlide={goToPrevSlide}
/>
<RightArrow
goToNextSlide={goToNextSlide}
/>
</div>
);
}
export default Slide;
【问题讨论】:
-
糟糕的解决方案是使用useEventCallback,但即使是模式来自的 React 文档也表示这不是一个好主意。您可以尝试使用 useReducer 和 dispatch the data as an action 设置您的状态
-
你能用包括退货在内的整个组件来编辑你的帖子吗?您提供的代码在我的本地环境中没有错误
-
@WilliamWillman 当您满足 linter 并将 data.currencies 添加到效果依赖项时不会。
标签: javascript reactjs asynchronous react-hooks