在 useEffect 中,不提供依赖数组和提供空数组有什么区别?

Pau*_*erg 65 reactjs react-hooks use-effect

我认为useEffectHook 在每次渲染后运行,如果提供了一个空的依赖数组:

useEffect(() => {
  performSideEffect();
}, []);
Run Code Online (Sandbox Code Playgroud)

但是这和下面的有什么区别呢?

useEffect(() => {
  performSideEffect();
});
Run Code Online (Sandbox Code Playgroud)

注意[]结尾的缺失。linter 插件不会发出警告。

Dra*_*scu 151

不完全一样。

  • 给它一个空数组就像componentDidMount在,它只运行一次。

  • 不给它第二个参数同时充当componentDidMountand componentDidUpdate,因为它首先在 mount 上运行,然后在每次重新渲染时运行。

  • 给它一个数组作为第二个参数,其中包含任何值,例如, [variable1]只会useEffect在挂载时执行一次钩子内的代码,以及每当该特定变量 (variable1) 更改时。

您可以在https://reactjs.org/docs/hooks-effect.html上阅读有关第二个参数的更多信息以及有关钩子如何在官方文档上实际工作的更多信息

  • 简短、准确、切中要点!超级答案,谢谢@bamtheboozle!:) (5认同)
  • @Patrick `useEffect` 将在 __after render__ 运行,而只需将代码放在那里将在 __before render__ 运行 (4认同)
  • 是否存在放置“null”的用例?这不是和不将代码放入 useEffect hook 中一样吗? (3认同)

Ank*_*aha 6

只是补充@bamtheboozle's回答。

如果您从您的 useEffect

useEffect(() => {
  performSideEffect();
  return cleanUpFunction;
}, []);
Run Code Online (Sandbox Code Playgroud)

它将在每次useEffect代码运行之前运行,以清理之前的 useEffect 运行。(除了第一次 useEffect 运行)

  • 您忘记提及清理功能也将始终在卸载时运行。因此,例如,如果依赖项数组为空(`[]`),则清理函数将仅运行一次:卸载时。请参阅[此处](https://reactjs.org/docs/hooks-effect.html#tip-optimizing-performance-by-skipping-effects)的“注释”部分(向下滚动)。 (4认同)

K. *_*ikh 6

聚会迟到了,但我想把这个例子放在这里,这是我在阅读上述评论后为了自己的理解而做的:

import './App.css';
import { useEffect, useState } from 'react';

function App() {

  const [name, setName] = useState('John');
   useEffect(()=>{
    console.log("1- No dependency array at all");
  });
  useEffect(()=>{
    console.log("2- Empty dependency array");
  }, []);
  useEffect(()=>{
    console.log("3- Dependency array with state");
  }, [name]);

  const clickHandler = () => {
    setName('Jane');
  }
  return (
    <div className="App">
      <button onClick={clickHandler}>Click to update state</button>
      <p>{`Name: ${name}`}</p>
    </div>
  );
}

export default App;
Run Code Online (Sandbox Code Playgroud)

输出

页面加载时

 1- No dependency array at all
 2- Empty dependency array
 3- Dependency array with state
 1- No dependency array at all
 2- Empty dependency array
 3- Dependency array with state
Run Code Online (Sandbox Code Playgroud)

单击按钮-状态更新

 1- No dependency array at all
 3- Dependency array with state
Run Code Online (Sandbox Code Playgroud)