reactjs - useEffect 依赖导致无限循环
问题描述
function Reply({ id, user }) {
const [data, setData] = useState([]);
const [replyText, setReplyText] = useState("");
useEffect(() => {
async function fetchData() {
const response = await _axios.get("/reply/" + id);
setData(response.data);
}
fetchData();
}, [data]); <---- ** problem ** with data(dependency),
infinite request(call) fetchData()
...
}
如果存在依赖关系,无限循环的原因是什么。据我所知,当依赖(数据)改变时,重新渲染。但 useEffect 不断要求数据(axios.get(~~))。如果我发表评论,我可以正常看到最新评论,但网络选项卡(在开发工具中)一直在询问数据(304 未修改,下图)
解决方案
有一个无限循环,因为该代码显示“如果data
更改,请从服务器请求信息并更改data
”。后半部分发生变化data
,再次触发前半部分。
您没有data
在回调中使用,因此它不应该是依赖项。只需将其删除:
useEffect(() => {
async function fetchData() {
const response = await _axios.get("/reply/" + id);
setData(response.data);
}
fetchData();
}, []);
// ^^−−−−−−−−−− don't put `data` here
这会给你一个空白的依赖数组,它只会在组件第一次挂载时运行效果。(如果您想在挂载后再次运行它,请为此使用不同的状态成员,或者fetchData
在效果外部定义并在效果中使用它,并在您想要获取数据的其他时间使用它。)
旁注:您的代码中没有任何内容处理来自您的fetchData
函数的拒绝,这将导致“未处理的拒绝”错误。您需要连接一个拒绝处理程序来报告或抑制错误。
推荐阅读
- python - Select is not iterable error while select is not iterable error while select a Dropdown option based on user input using Selenium and Python
- parsing - 使用 Parsec 在 Haskell 中编写小型解析器时出现问题
- angular - Angular ErrorHandler 和 HttpErrorResponse
- scala - Azure DataBricks - Deequ - 查找检查失败的行
- python-3.x - QuantReg:“交互式”对象没有“适合”属性
- excel - 将文本从字符串转换为整数
- javascript - 如何将键与对象键数组的总和进行比较?
- python - 无法接收来自另一台服务器的 POST 请求(Flask/Python)
- sql - SQL子查询涉及涉及多表的计算
- oracle-apex - 如何在页面之间传递数据值