[英]useEffect with dependency called infinitely
在从列表中添加/删除项目后,我有一个警报,我想在超时 function 中隐藏。
而不是清理超时 function,useEffect 结束在一个循环中。
function App() {
const [item, setItem] = useState({
id: "",
name: "",
});
const [list, setList] = useState([]);
const [isEditing, setISEditing] = useState(false);
const [alert, setAlert] = useState({
active: false,
type: "",
});
const addToList = (e) => {
e.preventDefault();
setAlert({ active: true, type: "success" });
let newItem = { id: new Date().getTime().toString(), name: item };
e.preventDefault();
setList([...list, newItem]);
};
const removeFromList = (id) => {
setAlert({ active: true, type: "danger" });
setList(list.filter((item) => item.id !== id));
};
useEffect(() => {
const timeout = setTimeout(() => {
setAlert({ active: false, type: "" });
}, 3000);
return () => clearTimeout(timeout);
}, [alert.active]);
使用alert.active
依赖项,您将在每次alert.active
更改时重新触发useEffect
。 在useEffect
中,您正在为alert.active
设置一个新值,因此创建了一个无限循环。
您应该直接在 addToList 末尾调用超时或从列表 function 中删除。 如果需要,可以将其隔离在单独的 function
const cancelTimeout = () => {
setTimeout(() => setAlert({ active: false, type: "" }), 3000)
}
并在AddToList
和removeFromList
结束时调用cancelTimeout
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.