![](/img/trans.png)
[英]UseEffect - React Hook useEffect has a missing dependency:
[英]React Hook useEffect has a missing dependency with useEffect
我一直遇到错误“React Hook useEffect 缺少依赖项”我正在尝试在 React 中保存到本地并且我的应用程序正在运行,但由于此警告我无法部署它。 警告是:**React Hook useEffect 缺少依赖项:'saveLocalTodos'。 要么包含它,要么删除依赖数组 ** 而我的代码是:
// Run once when the app starts useEffect(() => { getLocalTodos(); }, []); // useEffect useEffect(() => { // Function function filterHandler() { switch (status) { case `completed`: setFilteredTodos(todos.filter((todo) => todo.completed === true)); break; case `uncompleted`: setFilteredTodos(todos.filter((todo) => todo.completed === false)); break; default: setFilteredTodos(todos); break; } } filterHandler(); saveLocalTodos(); }, [todos, status]); // Save to Local const saveLocalTodos = () => { localStorage.setItem("todos", JSON.stringify(todos)); }; const getLocalTodos = () => { if (localStorage.getItem("todos") === null) { localStorage.setItem("todos", JSON.stringify([])); } else { let todoLocal = JSON.parse(localStorage.getItem(`todos`)); setTodos(todoLocal); } };
然后将您的依赖项包含在React.useEffect
的依赖项数组中。
您在saveLocalTodos
使用saveLocalTodos
, useEffect
在依赖项数组中定义它。 通常,经验法useEffect
使用的所有内容(函数、变量、状态、道具)都包含在依赖项数组中。 因为您的效果取决于它们,并且一旦它们的值发生变化就应该重新调用自己。
const saveLocalTodos = React.useCallback(() => {
localStorage.setItem("todos", JSON.stringify(todos));
}, [todos]);
useEffect(() => {
// Function
function filterHandler() {
switch (status) {
case `completed`:
setFilteredTodos(todos.filter((todo) => todo.completed === true));
break;
case `uncompleted`:
setFilteredTodos(todos.filter((todo) => todo.completed === false));
break;
default:
setFilteredTodos(todos);
break;
}
}
filterHandler();
saveLocalTodos();
}, [todos, status, saveLocalTodos]);
另外,用React.useCallback
包装你的saveLocalTodods
,因为在你的组件的每次重新渲染中,函数引用都会改变。 那么你的效果将无缘无故地被触发。 将todos
放在saveLocalTodos
内的依赖项数组中。 您希望您的函数仅在待办事项更改时更改。 否则,您将获得陈旧的待办事项。
您收到此错误是因为在useEffect
内部,您正在调用在useEffect
之外定义的getLocalTodos
和saveLocalTodos
函数。 理想的情况下内部useEffect依赖性阵列应定义所有的功能外,道具可变等,其将在内部使用useEffect
。 因此,每当依赖项发生任何变化时,都会在useEffect
内部触发效果。 当您创建任何函数时,将该函数包装在React.useCallback
并且在那里您可以传递该特定函数的依赖项,就像在您的情况下saveLocalTodos
依赖于 todos 一样,因此您的函数只会在 todos 更改时更改。 这样,您的功能只会在必要时更改。
const filterHandler = React.useCallback(() => {
switch (status) {
case `completed`:
setFilteredTodos(todos.filter((todo) => todo.completed === true));
break;
case `uncompleted`:
setFilteredTodos(todos.filter((todo) => todo.completed === false));
break;
default:
setFilteredTodos(todos);
break;
}
}, [todos, status]);
// Save to Local
const saveLocalTodos = React.useCallback(() => {
localStorage.setItem("todos", JSON.stringify(todos));
}, [todos]);
const getLocalTodos = React.useCallback(() => {
if (localStorage.getItem("todos") === null) {
localStorage.setItem("todos", JSON.stringify([]));
} else {
let todoLocal = JSON.parse(localStorage.getItem(`todos`));
setTodos(todoLocal);
}
},[]);
useEffect(() => {
filterHandler();
saveLocalTodos();
getLocalTodos();
}, [getLocalTodos, filterHandler, saveLocalTodos]);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.