繁体   English   中英

useEffect 具有无限调用的依赖项

[英]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)
}

并在AddToListremoveFromList结束时调用cancelTimeout

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM