是否可以使用useEffect挂钩中的清除功能从setCounter取消订阅?

时间:2020-04-08 04:50:13

标签: reactjs react-hooks use-effect

我使用setTimeout进行了简单的动画处理,但是在控制台中出现红色警告:

1警告:无法在未安装的状态下执行React状态更新 零件。这是空操作,但表示您的内存泄漏 应用。要修复,请取消所有订阅和异步任务 在useEffect清理功能中。在家里(由Context.Consumer创建)

  useEffect(() => {
    counter > 0 && setTimeout(() => setCounter(counter - 1), 1000);
    if (counter <= 16 && counter > 8) {
      setFlexStyle({
        width: "100%",
        float: "left",
        marginright: "-100%",
        position: "relative",
        display: "list-item",
      });
      setClassStyle("flex-active-slide");
      setFlexStyle2({
        width: "100%",
        float: "left",
        marginright: "-100%",
        position: "relative",
        display: "none",
      });
      setClassStyle2("");
    } else if (counter <= 8 && counter > 0) {
      setFlexStyle({
        width: "100%",
        float: "left",
        marginright: "-100%",
        position: "relative",
        display: "none",
      });
      setClassStyle("");
      setFlexStyle2({
        width: "100%",
        float: "left",
        marginright: "-100%",
        position: "relative",
        display: "list-item",
      });
      setClassStyle2("flex-active-slide");
    } else {
      setCounter(16);
    }
  }, [counter]);

1 个答案:

答案 0 :(得分:1)

useEffect(() => {
  const timer = counter > 0 ? setTimeout(() => setCounter(counter - 1), 1000) : null
  return () => clearTimeout(timer)
}, [counter] )

尝试一下

相关问题