react-hooks:跳过使用中的第一次运行

sey*_*yed 16 reactjs react-hooks

我该如何跳过第一次遇到问题useEffect

useEffect(() => {
    const first = // ???
  if (first) {
    // skip
  } else {
    // run main code
  }
}, [id]);
Run Code Online (Sandbox Code Playgroud)

Tho*_*lle 41

useRef挂钩可用于存储任何可变值,因此您可以存储一个布尔值,指示是否是第一次运行效果。

const { useState, useRef, useEffect } = React;

function MyComponent() {
  const [count, setCount] = useState(0);

  const isFirstRun = useRef(true);
  useEffect (() => {
    if (isFirstRun.current) {
      isFirstRun.current = false;
      return;
    }

    console.log("Effect was run");
  });

  return (
    <div>
      <p>Clicked {count} times</p>
      <button
        onClick={() => {
          setCount(count + 1);
        }}
      >
        Click Me
      </button>
    </div>
  );
}

ReactDOM.render(
  <MyComponent/>,
  document.getElementById("app")
);
Run Code Online (Sandbox Code Playgroud)
<script src="https://unpkg.com/react@16.7.0-alpha.0/umd/react.development.js"></script>
<script src="https://unpkg.com/react-dom@16.7.0-alpha.0/umd/react-dom.development.js"></script>

<div id="app"></div>
Run Code Online (Sandbox Code Playgroud)

  • 在函数外部声明的变量由组件的所有实例共享。 (6认同)
  • **注意**:如果您使用多个 useEffects 来检查 isFirstRun,请确保只有最后一个(位于底部)将 isFirstRun 设置为 false。React 按顺序遍历 useEffects! (6认同)
  • @estus使用例如const [isFirstRun,setFirstRun] = useState(true);并在第一次运行效果时使用setFirstRun会导致重新渲染,这可能不是您想要的。 (5认同)
  • @NicolasZozol 常规布尔值不会在渲染之间保留。你需要一个裁判。 (4认同)
  • 在这种情况下,您认为使用 useRef 与 useState 有什么好处吗? (2认同)
  • 这是个好点子,谢谢分享。这实际上是我注意到的我自己的实现的问题。 (2认同)
  • 为什么不简单地 `let isFirstRun = true;` ? (2认同)