Итак, у меня есть следующий компонент
const ChartContainer: React.FC = () => {
const [data, setData] = React.useState<unknown>([])
const [prevMonthStamp, setPrevMonthStamp] = React.useState<number>()
React.useEffect(() => {
var d: any = new Date();
d.setMonth(d.getMonth() - 30);//timestamp of x months ago
d.setHours(0, 0, 0, 0);
setPrevMonthStamp((d / 1000 | 0) * 1000);
}, [])
React.useEffect(() => {
let url = binanceApi
let proxyUrl = corsProxy
axios({
method: 'get',
url: proxyUrl+url
}).then(res => {
if (prevMonthStamp) {
setData(res.data.filter((i: number[]) => i[0] >= prevMonthStamp))
}
}).catch(err => {
console.log(err)
})
}, [prevMonthStamp])
if (Array.isArray(data) && data?.length > 0) {
return (
<Canvas data={convertData(data)} />
);
} else {
return <Spinner />
}
}
И я заметил, что API вызывается дважды
Предположительно, при монтировании компонента я устанавливаю prevMonthStamp, и после его установки используется другой useEffect.
Почему он используется дважды?
Ваш второй useEffect запускается дважды: 1 при монтировании и второй раз, когда вы устанавливаете
setPrevMonthStamp
в свой первыйuseEffect
Хук
useEffect()
вызывается при монтировании компонента. Итак, второйuserEffect()
выполняется один раз, когда компонент монтируется, и второй раз, когда его зависимостьprevMountStamp
устанавливается при первом вызовеuseEffect()
.