reactjs - 如何从api加载数据并使用map函数异步加载组件
问题描述
我的后端数据库存储了数百个产品,我想以异步方式将它们列出给前端响应用户,而无需等到所有数据都加载完毕。虽然我使用 api 兑现,但将产品列表映射到组件仍然需要几秒钟。
我使用带有 axios 和 async/wait 函数的 useAPI 钩子从 api 获取数据。
有什么办法可以改善加载并使组件定期更新?如何在前端缓存数据以避免对数据库的过度调用?
import React from "react";
import useAPI from '../../api/useAPI'
import { ProductsListWrap, ProductCard } from '../../components'
const ProductsList = (props) => {
const handleSelect = (data) => {
console.log(data)
};
const [products, loading, error, retry] = useAPI('/api/v1/products');
return (
<ProductsListWrap>
{products.map((data, i) => {
return (
<ProductCard
handleSelect={() => handleSelect(data)}
key={i}
{...data}
/>
);
})}
</ProductsListWrap>
);
};
export default ProductsList;
解决方案
首先,您可能需要对请求进行分页。
您可以创建一个“缓存”,为您的钩子添加一个状态。此外,您还需要在内部创建一个函数以随时发出请求。
还添加一个名为的函数,即添加fetchData
到您的钩子(如果它不存在)。
也返回那个fetchData
函数。
function yourHook() {
const [cache, setCache] = useState();
function fetchData() {
if (!cache) {
// your axios logic
setCache(response);
}
}
...
return [fetchData, cache, loading, error, retry];
}
调用你fetchData
的组件(注意现在products
是cache
):
const [fetchData, products, loading, error, retry] = useAPI('/api/v1/products');
useEffect(() => {
fetchData();
}, []);
return (
<ProductsListWrap>
{products && products.map...}
</ProductsListWrap>
);
推荐阅读
- twilio - 通过 twiml 发出挂断后,twilio 不会挂断
- tensorflow - Keras 函数式 api 输入形状
- mysql - 通过 PHPmyAdmin 错误 #1366 在 mysql (mariadb) 数据库中保存 UTF8mb4 表情符号时出错
- python - django 获取最新的其他列值的查询集
- multithreading - 多线程模型概念
- python - 使用 dict 键格式化字符串的有效方法,无需重复使用间歇性变量
- python - 在管道中按组应用 sklearn 预处理功能
- arrays - 凯撒,检测到钥匙有问题
- python - 如何收听特定窗口的按键
- hadoop - 随着 Hadoop 集群中节点数量的增加,数据处理时间下降的模式