Reactjs 我如何做出反应';s使用Effect停止无限循环中的重新加载程序,即使指定了依赖项?
我正在使用react和mongodb开发一个小型CRUD fullstack应用程序,我遇到了一个问题,我使用Reactjs 我如何做出反应';s使用Effect停止无限循环中的重新加载程序,即使指定了依赖项?,reactjs,react-hooks,Reactjs,React Hooks,我正在使用react和mongodb开发一个小型CRUD fullstack应用程序,我遇到了一个问题,我使用useffect向服务器发出axios get请求,以获取我的所有TODO。问题是,useffect完成了它的工作,但它也会无限重复。这是我的组件: export default function () { ... const [todos, setTodos] = useState([]); const currentUser = JSON.parse(loca
useffect
向服务器发出axios get请求,以获取我的所有TODO。问题是,useffect
完成了它的工作,但它也会无限重复。这是我的组件:
export default function () {
...
const [todos, setTodos] = useState([]);
const currentUser = JSON.parse(localStorage.getItem('user'))._id;
useEffect(() => {
async function populateTodos () {
try {
const res = await axios.get(`http://localhost:8000/api/all-todos/${currentUser}`);
setTodos(res.data);
} catch (err) {
if (err.response) {
console.log(err.response.data);
console.log(err.response.status);
console.log(err.response.headers);
} else if (err.request) {
console.log(err.request);
} else {
console.log('Error: ', err.message);
}
}
}
populateTodos();
}, [todos]);
console.log(todos);
return (
...
);
}
所以我期望发生的是,
console.log
仅在todo更改时打印,比如添加新todo等,但它会永远打印。您说过,您需要首先获取todo
,并且在todo
更改时获取。我可以建议您使用另一种方法,使用另一个变量,如下所示:
const TodosComponent = (props) => {
const [todos, setTodos] = useState([]);
const [updatedTodos, setUpdatesTodos] = useState(true);
const fetchFunction = () => {
// In here you implement your fetch, in which you call setTodos().
}
// Called on mount to fetch your todos.
useEffect(() => {
fetchFunction();
}, []);
// Used to updated todos when they have been updated.
useEffect(() => {
if (updatedTodos) {
fetchFunction();
setUpdatesTodos(false);
}
}, [updatedTodos]);
// Finally, wherever you update your todos, you also write `updateTodos(true)`.
}
想想这个流程:当
todos
发生变化时运行效果。在效果中更新todo
的值。确实要在todo
更改时运行效果吗?或者axios请求应该只发生一次吗?我想以初始值运行effect来填充状态(todos),然后todos中发生每一次时间更改。我明白你的意思,我更新setTodos,然后把todos作为依赖项,它就一直这样循环。这意味着我必须定义一个新变量,并将其设置为useEffect依赖项,并在每次更改TODO时更新新的状态。Idk。我会尝试一下,它会无限地运行,因为每次TODO改变时,useEffect都会运行,而useEffect也会改变TODO,从而使它自己一次又一次地运行。注意:为了避免使用useEffect的无限循环,useEffect不能更改/变异其依赖项。