reactjs - React Rest Call Infinite Loop 使用 Hooks
问题描述
我注意到我的组件陷入了无限循环。它一直在打同样的休息电话。
据我了解,useEffect
钩子的工作方式类似于 ComponentRender 和 ComponentUpdate 生命周期函数。
另外,我认为正在发生的事情是这样但无法修复它:
在渲染 -> API 调用 -> 更新错误状态 -> 组件更新 -> UseEffect Hooked 再次调用
你能帮助我吗?
import React, { useState, useEffect } from "react";
import "./ResultsPage.css";
import Error from "../components/Error";
function Homepage() {
let username = "test";
const [error, setError] = useState({ exists: false, value: null });
const [userData, setUserData] = useState(null);
const getUsernameData = () => {
fetch(`testAPI/${username}`)
.then((response) => {
if (response.status === 404) {
return setError({ exists: true, value: response.status });
}
return response.json();
})
.then((json) => setUserData(json))
.catch((error) => {
setError({ active: true, type: 400 });
});
};
useEffect(() => {
getUsernameData();
});
return (
<div className="Homepage">
{error.exists && <Error error={error} username={username} />}
{!error.exists && <h1>Error does not exist</h1>}
</div>
);
}
export default Homepage;
解决方案
useEffect
除非您另有说明,否则将在每个渲染上运行。您的效果没有依赖数组,因此它运行每个渲染,触发重新渲染,然后无限重新开始。
您可以useEffect
通过给它一个空数组来告诉它只在挂载上运行一次:
useEffect(() => {
getUsernameData();
}, []);
您还可以告诉它仅在某些事情发生变化时运行。通过将变量添加到依赖数组来做到这一点:
useEffect(() => {
getUsernameData();
}, [variable_to_depend_on]);
推荐阅读
- python - 未找到 PPTX 包
- reactjs - 尝试根据枚举值动态设置接口
- python - Python:async/await 可以模仿这个基于生成器的解决方案吗?
- visual-studio-code - 从 VS Code 导出笔记本返回损坏的 pdf 或空白 HTML
- adal - 无法使用 msal-browser 静默或通过重定向获取令牌
- c++ - 为什么在 C++ 中不能很好地优化一个幼稚的 abs 实现?
- r - 仅当字符串与多列匹配时如何过滤行
- react-native - 使用 createBottomTabNavigator 时是否可以从第二个选项卡开始?
- python - qsharp 和 python:从控制台中删除“准备 qsharp 环境”消息
- javascript - CSS 新的“内容可见性”属性是否会干扰脚本加载行为?