4 回答

TA貢獻1786條經驗 獲得超13個贊
更新:根據Finnhub API,它是您從 API 收到的對象,而不是數組。這意味著charData.length
在我之前的回答中永遠不會被評估true
,子組件也QuoteChart
永遠不會被渲染。
我建議進行以下更改。在您的父組件中,charData = null
最初制作:
const?[chartData,?setChartData]?=?useState(null);
當 API 返回響應并chartData
分配了一個值時,您的子組件可以呈現:
{chartData?&&?<QuoteChart?chartData={chartData}?iex={iex}?/>}
您要在子組件中呈現的圖表需要以下輸入:[{ x: date, y: [O,H,L,C] }]
。因為map()
只能在數組上調用而chartData
不是一個數組,所以您應該導航到所述對象內的數組之一,例如chartData.t
:
const chartRender = chartData.t.map((timestamp, index) => ({
? ? x: new Date(timestamp),
? ? y: [chartData.o[index], chartData.h[index], chartData.l[index], chartData.c[index]],
}));
最后,series.data需要一個數組,你不需要另外將它包裝在一個對象中。所以這應該有效:
const config = {
? ? series: [{
? ? ? ? data: chartRender
? ? }]
};
您chartData使用空數組進行初始化,因此您的條件應如下所示:
{chartData.length && <QuoteChart chartData={chartData} iex={iex} />}
如果您希望 API 返回一個空列表,我建議設置一個undefinedornull作為 的初始值chartData:
const [chartData, setChartData] = useState(null);
在這種情況下,您可以保持現狀。

TA貢獻1848條經驗 獲得超2個贊
如果我沒記錯的話,你可以簡單地使用 async/await 來解決你的問題。因此,將 useEffect 行更改為
useEffect(async () => { {/*Fetching API response here to set state*/}
進而
await axios .get( `https://finnhub.io/api/v1/stock/candle?symbol=${symbol}&resolution=15&from=1572651390&to=1602623478&token=xxxxxxxxx` )
然后你的應用程序應該等待 axios 完成獲取

TA貢獻1836條經驗 獲得超13個贊
最簡單的方法需要對代碼進行簡單的小改動:
{chartData.length && <QuoteChart chartData={chartData} iex={iex} />}
研究 finnhub 后 - 我發現響應不是數組。我測試了這個網址:
https://finnhub.io/api/v1/stock/candle?symbol=AAPL&resolution=15&from=1572651390&to=1602623478&token=
響應是一個具有“c”屬性的對象。您的代碼應該相應地修改。對于上面的鏈接示例:
setChartData(res.data.c);

TA貢獻1780條經驗 獲得超1個贊
您需要將 axios 調用包裝在異步函數中,wait然后
useEffect(() => { {/*Fetching API response here to set state*/}
const getInfo = async () => {
await res = axios
.get(
`https://finnhub.io/api/v1/stock/candle?symbol=${symbol}&resolution=15&from=1572651390&to=1602623478&token=xxxxxxxxx`
)
console.log(res.data);
setChartData(res.data);
}
getInfo()
}, [symbol]);
添加回答
舉報