第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

僅在 API 請(qǐng)求完成后渲染組件 React hooks

僅在 API 請(qǐng)求完成后渲染組件 React hooks

白豬掌柜的 2023-05-18 09:51:15
當(dāng)我的圖表組件呈現(xiàn)時(shí)出現(xiàn)錯(cuò)誤,因?yàn)樗某跏紶顟B(tài)是 API 響應(yīng)之前的空數(shù)組。它會(huì)說(shuō)這樣的話Cannot read property '0' of undefined是因?yàn)楫?dāng)組件加載時(shí),它的初始狀態(tài)是,好吧......一個(gè)空數(shù)組。所以我想知道是否有辦法讓組件僅在收到 API 響應(yīng)后才呈現(xiàn)。這是父組件: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;這是子圖表組件,基本上當(dāng)我從 axios 執(zhí)行獲取請(qǐng)求時(shí),它返回一個(gè)將映射到對(duì)象中的數(shù)組chartRender。我只需要找到一種方法來(lái)僅在 axios 的 api 請(qǐng)求完成后才呈現(xiàn)組件,以免出現(xiàn)錯(cuò)誤。任何幫助將不勝感激。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 回答

?
開滿天機(jī)

TA貢獻(xiàn)1786條經(jīng)驗(yàn) 獲得超13個(gè)贊

更新:根據(jù)Finnhub API,它是您從 API 收到的對(duì)象,而不是數(shù)組。這意味著charData.length在我之前的回答中永遠(yuǎn)不會(huì)被評(píng)估true,子組件也QuoteChart永遠(yuǎn)不會(huì)被渲染。

我建議進(jìn)行以下更改。在您的父組件中,charData = null最初制作:

const?[chartData,?setChartData]?=?useState(null);

當(dāng) API 返回響應(yīng)并chartData分配了一個(gè)值時(shí),您的子組件可以呈現(xiàn):

{chartData?&&?<QuoteChart?chartData={chartData}?iex={iex}?/>}

您要在子組件中呈現(xiàn)的圖表需要以下輸入:[{ x: date, y: [O,H,L,C] }]。因?yàn)?code>map()只能在數(shù)組上調(diào)用而chartData不是一個(gè)數(shù)組,所以您應(yīng)該導(dǎo)航到所述對(duì)象內(nèi)的數(shù)組之一,例如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需要一個(gè)數(shù)組,你不需要另外將它包裝在一個(gè)對(duì)象中。所以這應(yīng)該有效:


const config = {

? ? series: [{

? ? ? ? data: chartRender

? ? }]

};

您chartData使用空數(shù)組進(jìn)行初始化,因此您的條件應(yīng)如下所示:


{chartData.length && <QuoteChart chartData={chartData} iex={iex} />}

如果您希望 API 返回一個(gè)空列表,我建議設(shè)置一個(gè)undefinedornull作為 的初始值chartData:


const [chartData, setChartData] = useState(null);

在這種情況下,您可以保持現(xiàn)狀。


查看完整回答
反對(duì) 回復(fù) 2023-05-18
?
慕尼黑5688855

TA貢獻(xiàn)1848條經(jīng)驗(yàn) 獲得超2個(gè)贊

如果我沒(méi)記錯(cuò)的話,你可以簡(jiǎn)單地使用 async/await 來(lái)解決你的問(wèn)題。因此,將 useEffect 行更改為

useEffect(async () => {  {/*Fetching API response here to set state*/}

進(jìn)而

 await axios
    .get(
            `https://finnhub.io/api/v1/stock/candle?symbol=${symbol}&resolution=15&from=1572651390&to=1602623478&token=xxxxxxxxx`
    )

然后你的應(yīng)用程序應(yīng)該等待 axios 完成獲取


查看完整回答
反對(duì) 回復(fù) 2023-05-18
?
開心每一天1111

TA貢獻(xiàn)1836條經(jīng)驗(yàn) 獲得超13個(gè)贊

最簡(jiǎn)單的方法需要對(duì)代碼進(jìn)行簡(jiǎn)單的小改動(dòng):

 {chartData.length && <QuoteChart chartData={chartData} iex={iex} />}

研究 finnhub 后 - 我發(fā)現(xiàn)響應(yīng)不是數(shù)組。我測(cè)試了這個(gè)網(wǎng)址:

https://finnhub.io/api/v1/stock/candle?symbol=AAPL&resolution=15&from=1572651390&to=1602623478&token=

響應(yīng)是一個(gè)具有“c”屬性的對(duì)象。您的代碼應(yīng)該相應(yīng)地修改。對(duì)于上面的鏈接示例:

setChartData(res.data.c);


查看完整回答
反對(duì) 回復(fù) 2023-05-18
?
慕神8447489

TA貢獻(xiàn)1780條經(jīng)驗(yàn) 獲得超1個(gè)贊

您需要將 axios 調(diào)用包裝在異步函數(shù)中,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]);


查看完整回答
反對(duì) 回復(fù) 2023-05-18
  • 4 回答
  • 0 關(guān)注
  • 228 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)