让useEffect监视条件并使其仅触发一次

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了让useEffect监视条件并使其仅触发一次相关的知识,希望对你有一定的参考价值。

反应的useEffect看起来像这样:

useEffect(() => {
  effect
  return () => {
    cleanup
  }
}, [input])

其中input是在更改后触发效果的值的列表。

假设我正在观看一个数字,而我只想在数字达到10时触发效果。可以这样做吗?

到目前为止,我能想到的最好的办法是将观察到的表达式编码为布尔值。然后触发该效果两次,一次是布尔值从false变为true,另一次是布尔值返回false。这曾经太多了。这是一个小例子:

export default function App() {
  const [num, setNum] = useState(0);
  const hit10 = num === 10;
  useEffect(() => {
    console.log("resetting");
    setNum(0);
  }, [hit10]);

  return (
    <button
      onClick={() => {
        setNum(num + 1);
      }}
    >
      {num}
    </button>
  );
}
答案

您不需要使用其他变量,例如hit10,您只需在useEffect()钩子内放置一个条件,即可在每次呈现组件时检查该数字的值。

 import React, {useState, useEffect} from "react";
    import "./styles.css";

    export default function App() {
      const [num, setNum] = useState(0);

      useEffect(() => {
        if(num === 10) {
          console.log("resetting");
          setNum(0);
        }
      }, [num]);

      return (
        <button
          onClick={() => {
            setNum(num + 1);
          }}
        >
          {num}
        </button>
      );
    }

以上是关于让useEffect监视条件并使其仅触发一次的主要内容,如果未能解决你的问题,请参考以下文章

过滤现有项目组,使其仅包含符合某些条件的文件

单击表视图使其仅在第一次单击时附加字符串,而不是在 didSelectRowAtIndexPath 中的另一次单击时附加字符串

javascript - 检查函数执行计数并使其执行不超过一次

如何使HTML中的输入框使其仅接受IP ADDRESS [重复]

导航栏不会根据路由条件在 app.js 中呈现。路由更改时不会触发 Useeffect

使用 str_replace 使其仅作用于第一个匹配项?