亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

僅在 API 請求完成后渲染組件 React hooks

僅在 API 請求完成后渲染組件 React hooks

白豬掌柜的 2023-05-18 09:51:15
當我的圖表組件呈現時出現錯誤,因為它的初始狀態是 API 響應之前的空數組。它會說這樣的話Cannot read property '0' of undefined是因為當組件加載時,它的初始狀態是,好吧......一個空數組。所以我想知道是否有辦法讓組件僅在收到 API 響應后才呈現。這是父組件:function InformationPage({    match: {        params: { symbol },    },}) {    const [chartData, setChartData] = useState([]); {/*Declaring state*/}useEffect(() => {  {/*Fetching API response here to set state*/}    axios        .get(            `https://finnhub.io/api/v1/stock/candle?symbol=${symbol}&resolution=15&from=1572651390&to=1602623478&token=xxxxxxxxx`        )        .then((res) => {            console.log(res.data);            setChartData(res.data);        })        .catch((err) => {            console.log(err);        });}, [symbol]);return (            <Grid item container xs={12} sm={12} md={6} lg={8}>            {chartData && <QuoteChart chartData={chartData} iex={iex} />}        </Grid>       );}export Default InformationPage;這是子圖表組件,基本上當我從 axios 執行獲取請求時,它返回一個將映射到對象中的數組chartRender。我只需要找到一種方法來僅在 axios 的 api 請求完成后才呈現組件,以免出現錯誤。任何幫助將不勝感激。function QuoteChart(props) {    const classes = useStyles();    const { chartData } = props;    const chartRender = chartData.map((chartConfig) => ({        x: new Date(chartConfig?.t),        y: [chartConfig?.o, chartConfig?.h, chartConfig?.l, chartConfig?.c],    }));    // const chartDataLog = console.log(chartData);    const config = {        series: [            {                data: [{ chartRender }],            },        ],
查看完整描述

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);

在這種情況下,您可以保持現狀。


查看完整回答
反對 回復 2023-05-18
?
慕尼黑5688855

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 完成獲取


查看完整回答
反對 回復 2023-05-18
?
開心每一天1111

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);


查看完整回答
反對 回復 2023-05-18
?
慕神8447489

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]);


查看完整回答
反對 回復 2023-05-18
  • 4 回答
  • 0 關注
  • 222 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號