Javascript 使用react钩子时的无限循环
在过去的几天里,我一直在学习react,在使用useEffect钩子时,我在设置状态变量时得到了infite循环 有谁能告诉我发生了什么,以及如何克服这个问题吗 这是我的密码Javascript 使用react钩子时的无限循环,javascript,reactjs,Javascript,Reactjs,在过去的几天里,我一直在学习react,在使用useEffect钩子时,我在设置状态变量时得到了infite循环 有谁能告诉我发生了什么,以及如何克服这个问题吗 这是我的密码 import React, { useState, useEffect } from "react"; import axios from "axios"; const TodoEntry = () => { const [todos, setTodos] = useS
import React, { useState, useEffect } from "react";
import axios from "axios";
const TodoEntry = () => {
const [todos, setTodos] = useState('');
useEffect(() => {
axios.get('http://localhost:5000/api/todos')
.then(res => { setTodos(res.data); console.log(todos) })
.catch(err => console.log(err))
},[todos]);
return (
<div>
<h1>Todo App</h1>
</div>
);
};
export default TodoEntry;
import React,{useState,useffect}来自“React”;
从“axios”导入axios;
const TodoEntry=()=>{
const[todos,setTodos]=useState(“”);
useffect(()=>{
axios.get()http://localhost:5000/api/todos')
.then(res=>{setTodos(res.data);console.log(todos)})
.catch(err=>console.log(err))
}[待办事项];
返回(
待办事项应用程序
);
};
将默认值导出到入口;
这是因为useffect
调用的依赖项列表是一个函数。您可能想添加todos数据本身
useEffect(() => {
getTodos();
},[todos]);
代码中有几个问题:
- 由于
函数是gettoos
hook的依赖项,因此每次状态更新时,都会创建新的useffect
函数,然后触发gettoos
hookuseffect
- 在使用
语法时,不需要链接async wait
函数。您可以等待axios.get(…)的结果then
- 将
函数包装在getTodos
hook中。有关详细信息,请参阅 由于,useCallback
函数调用getTodos
,因此需要将其包装在displayTodos
钩子中,并将useCallback
添加到包装displayTodos
函数的gettoos
钩子的依赖项数组中。在我看来,最好删除useCallback
函数,并更新displayTodos
函数中的状态gettoos
演示const getTodos = useCallback(async () => { try { const res = await axios.get('http://localhost:5000/api/todos') setTodos(res.data); } catch(err) { console.log(err); } }, [setTodos]);
- 将代码放入
内部getTodos
钩子并移除useffect
函数getTodos
演示useEffect(() => { axios.get("http://localhost:5000/api/todos") .then(res => setTodos(res.data)) .catch(err => console.log(err)); }, [setTodos]);
useffect(()=>{gettoos();},[todos])代码>试试这个。useffect(()=>gettoos(),[])代码>因为您只想在装载时执行一次。如果有一个linter抛出错误,那么可以在useCallback
中包装gettoos
以记忆它(而不是在每次渲染时创建新的函数引用),并将其添加回dependencies数组,或者将getTodos
代码放在useffect
钩子中。@MichaelYaworski在useffect
钩子的依赖项中跳过添加依赖项不是一个好主意array@Yousaf这是一个好主意,如果你只想做这件事mount@MichaelYaworski谢谢你,我尝试了第二种方法并得到了正确的结果。请注意,从依赖项数组中省略setTodos
是否安全,因为它是useState
hook中的一个函数:“React保证setState
函数标识稳定,在重新渲染时不会更改。这就是为什么从useffect
或useCallback
依赖项列表中省略是安全的。”@MichaelYaworski是的,它是安全的,但我仍然不介意将其作为依赖项添加,因为它让我养成了不丢失依赖项的习惯