【发布时间】:2021-07-04 13:50:10
【问题描述】:
所以我想每 5 秒更新一次实时价格,因此我将递归 setTimeout 放入函数中。不幸的是,现在价格馈送是这样工作的:
- 一开始控制台输出为:未定义和当前价格
- 价格更改后输出为:未定义、旧价格、新当前价格
- 下一次价格更改后:未定义、最旧价格、旧价格、新当前价格
为什么它会附加值而不是像往常一样覆盖它们?
import React, { useState, useEffect } from 'react';
import TextField from '@material-ui/core/TextField';
import Button from '@material-ui/core/Button';
import Livebsv from './livebsv.js';
const CoinGecko = require('coingecko-api');
const CoinGeckoClient = new CoinGecko();
export default function Calculatorbuy() {
const [value, setValue] = useState(0);
const [price, setPrice] = useState();
useEffect(() => {
const fetchPrice = async () => {
const result = await CoinGeckoClient.simple.price({
ids: "bitcoin-cash-sv",
vs_currencies: "pln",
});
setPrice(parseFloat(result.data.['bitcoin-cash-sv'].pln));
console.log(price);
setTimeout(fetchPrice, 5000)
};
fetchPrice();
})
【问题讨论】:
-
console.log(price);将输出旧价格。 -
它是如何追加的?在我看来,它每次都有不同的价值
-
还可以尝试将依赖数组添加到您的 useEffect 挂钩 [价格]
-
您正在记录当前状态,请参阅stackoverflow.com/questions/54069253/…。此外,您的
useEffect缺少依赖数组,因此每次组件呈现时您都会开始新的超时“链”。我猜你的意思是只在组件挂载时启动一个,所以使用一个空的依赖数组([])只运行一次效果。确保还捕获超时 id,以便您可以在返回的效果清理函数中取消任何正在运行的计时器。我也没有看到任何附加,你的状态是一个数字。 -
完全同意@drew-reese 但是,正如@dario-k 所说,你为什么说要附加值?
console.log只显示一个正在使用不同值更新的数字
标签: javascript reactjs next.js bitcoin