useEffect React钩子将在每次更改时运行传入函数。可以对其进行优化,使其仅在所需属性更改时调用。

如果我想从componentDidMount调用初始化函数,而不是在更改时再次调用它,该怎么办?假设我想加载一个实体,但加载函数不需要来自组件的任何数据。我们如何使用useEffect钩子来实现这个?

class MyComponent extends React.PureComponent {
    componentDidMount() {
        loadDataOnlyOnce();
    }
    render() { ... }
}

如果使用钩子,可能是这样的:

function MyComponent() {
    useEffect(() => {
        loadDataOnlyOnce(); // this will fire on every change :(
    }, [...???]);
    return (...);
}

当前回答

将依赖项数组保留为空。希望这能帮助你更好地理解。

   useEffect(() => {
      doSomething()
    }, []) 

空依赖数组只在挂载时运行一次

useEffect(() => {
  doSomething(value)
}, [value])  

将值作为依赖项传递。如果依赖关系自上次以来发生了变化,该效果将再次运行。

useEffect(() => {
  doSomething(value)
})  

没有依赖。这个在每次渲染后都会被调用。

其他回答

function useOnceCall(cb, condition = true) {
  const isCalledRef = React.useRef(false);

  React.useEffect(() => {
    if (condition && !isCalledRef.current) {
      isCalledRef.current = true;
      cb();
    }
  }, [cb, condition]);
}

并利用它。

useOnceCall(() => {
  console.log('called');
})

or

useOnceCall(()=>{
  console.log('Fetched Data');
}, isFetched);

将依赖项数组保留为空。希望这能帮助你更好地理解。

   useEffect(() => {
      doSomething()
    }, []) 

空依赖数组只在挂载时运行一次

useEffect(() => {
  doSomething(value)
}, [value])  

将值作为依赖项传递。如果依赖关系自上次以来发生了变化,该效果将再次运行。

useEffect(() => {
  doSomething(value)
})  

没有依赖。这个在每次渲染后都会被调用。

如果你只是在渲染后调用useeffect中的函数,你添加一个空数组作为useeffect的第二个参数

useEffect=(()=>{
   functionName(firstName,lastName);
},[firstName,lastName])

如果您只想在初始呈现后运行给useEffect的函数,可以给它一个空数组作为第二个参数。

function MyComponent() {
  useEffect(() => {
    loadDataOnlyOnce();
  }, []);

  return <div> {/* ... */} </div>;
}

我喜欢定义一个mount函数,它以useMount的方式欺骗EsLint,我发现它更不言自明。

const mount = () => {
  console.log('mounted')
  // ...

  const unmount = () => {
    console.log('unmounted')
    // ...
  }
  return unmount
}
useEffect(mount, [])