gpt4 book ai didi

javascript - 在渲染 react Hook 之前等待 API 数据

转载 作者:行者123 更新时间:2023-12-04 17:21:36 28 4
gpt4 key购买 nike

我进行了两次 API 调用。来自 getAllCampaign api 的数据呈现,但对于 loadStats 似乎 React 继续构建没有数据的表,因此抛出错误未捕获的类型错误:无法读取未定义的属性“数据”这就是我正在做的事情。

核心 API 助手:

export const getAllCampaign = () => {
return fetch(`https://api.truepush.com/api/v1/listCampaign/1`, {
method: "GET",
headers: {
Authorization: `$TOKEN`,
"Content-Type": "application/json",
},
})
.then(response => {
return response.json()
})
.catch(err => console.log(err))
}

export const loadStats = async () => {
const ids = await getAllCampaign()

const data = Promise.all(
ids.data.map(async (i) => await (await fetch(`https://api.truepush.com/api/v1/campaignStats/${i.campaignId}`, {
method: "GET",
headers: {
Authorization: ``$TOKEN``,
"Content-Type": "application/json"
}
})).json())
)
return data
};

allData 控制台输出延迟

完整代码:

import React, {useState, useEffect} from 'react';
import {getAllCampaign, loadStats} from "../helpers/coreapihelpers";

const TableRow = () => {

const [campaigns, setCampaigns] = useState([]);
const [stats, setStats] = useState([]);

const loadAllCampaigns = () => {
getAllCampaign()
.then(data => { setCampaigns(data.data) })
.catch(err => { console.log(err) });
};

const loadAllStats = () => {
loadStats()
.then(data => { setStats(data) })
.catch(err => { console.log(err) });
}

useEffect(() => {
loadAllCampaigns();
loadAllStats();
}, [])

const allData = campaigns.map ? campaigns.map((campaign, i) => ({
...campaign,
...stats[i],
}))
: <h1>API LIMIT EXCEEDS</h1>

return (
<div className="container">
<div className="row">
<div className="col-xs-12">
{allData.map ? allData.map((campaigns, index) => (
<div className="table-responsive" data-pattern="priority-columns">
<table className="table table-bordered table-hover">
<thead>
<tr>
<th>Sr. No</th>
<th>Campaign Id</th>
<th>Campaign Name</th>
<th>Campaign Status</th>
<th>Reach</th>
<th>Sent</th>
<th>Delivered</th>
<th>Views</th>
<th>Clicks</th>
<th>Unsubscribers</th>
</tr>
</thead>
<tbody>
<tr key={index}>
<td>{index + 1}</td>
<td>{campaigns.campaignId}</td>
<td>{campaigns.campaignTitle}</td>
<td>{campaigns.campaignStatus}</td>
<td>{campaigns.data.Reach}</td>
<td>{campaigns.data.Sent}</td>
<td>{campaigns.data.Delivered}</td>
<td>{campaigns.data.Views}</td>
<td>{campaigns.data.Clicks}</td>
<td>{campaigns.data.Unsubscribers}</td>
</tr>
</tbody>
</table>
</div>)) : <h1>API Limit Exceeds / API Token Broken</h1>}
</div>
</div>
</div>
);
}

export default TableRow;

最佳答案

我认为问题在于您应该检查状态 campaigns 是否已填充,而不是 allDataallData 是一个变量,不是实际状态。实际状态应用于条件渲染。试试这个:

替换这个:

allData.map ? allData.map((campaigns, index)

有了这个:

campaigns ? allData.map((campaigns, index)

但是,您应该为状态创建一个包含事件和统计数据的对象,因为您打算将它们用作相应的项目。或者,您的数据库查询应该将它们作为一个项目返回,并带有一些连接时间。

试试这个客户端解决方案:

const [stateObj, setObj] = useState([]);
const campaigns = [];
const stats = [];

const loadAllState = async () => {
try {
campaigns = await getAllCampaign();
} catch (err) {
console.log(err)
}

try {
stats = await loadStats();
} catch (err) {
console.log(err)
}

setObj(campaigns.map((campaign, i) => ({
...campaign,
...stats[i],
})))
};

useEffect(() => {
loadAllState();
}, [])

然后:

stateObj ? stateObj.map((campaigns, index)

关于javascript - 在渲染 react Hook 之前等待 API 数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65848096/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com