reactjs - 在 useEffect 中使用异步函数的首选方式
问题描述
我知道在 useEffect 中使用异步函数的两种方法。我在某处读到第一种方法是错误的。你认为哪种方式更好?
第一种方法
async function fetchData() {
const result = await axios(
'https://hn.algolia.com/api/v1/search?query=react',
);
setData(result.data);
}
useEffect(() => {
fetchData();
}, [miliko]);
第二种方法
useEffect(() => {
async function fetchData() {
const result = await axios(
'https://hn.algolia.com/api/v1/search?query=react',
);
setData(result.data);
}
fetchData();
}, [miliko]);
解决方案
两种解决方案都是正确的,只要 fetchData 使用的数据在其词法范围内,它们就可以工作
这两种方法的唯一区别是,fetchData
在第一种情况下,每次渲染都会创建一个新的引用,而在第二种情况下,只会在初始渲染和miliko
更改时创建一个新的引用
要将相关代码放在一起,您可以继续使用第二种方法,如果发出新请求,您可以更轻松地取消先前的请求,这样您就不会看到不一致的地方
useEffect(() => {
const CancelToken = axios.CancelToken;
const source = CancelToken.source();
async function fetchData() {
const result = await axios(
'https://hn.algolia.com/api/v1/search?query=react', {
cancelToken: source.token
}
);
setData(result.data);
}
fetchData();
return () => {
source.cancel('Effect cleared');
}
}, [miliko]);
推荐阅读
- vb.net - 旧版本 vb 中使用的 adocom 问题
- javascript - "RequestAnimationFrame()" FPS = 显示刷新率?这会影响性能吗?
- django - 异常值:NOT NULL 约束失败:auth_user.username
- css - 打印页眉和页脚的媒体查询
- html - 如何在兄弟 div 留下的剩余空间中居中 div
- c++ - 谷歌 C++ 风格指南包括订单
- javascript - 关于 async/await 与 Promises 和事件循环的性能问题
- reactjs - ReactJs Material UI 随机问题
- javascript - 是否可以在组件文件中重新创建 ngIf 和异步管道行为?
- c# - 数据包未被读取 TCP