How to fix missing dependency warning when using useEffect React Hook?

前端 未结 13 2002
无人及你
无人及你 2020-11-22 03:14

With React 16.8.6 (it was good on previous version 16.8.3), I get this error when I attempt to prevent an infinite loop on a fetch request

./src/components/Bu         


        
13条回答
  •  北荒
    北荒 (楼主)
    2020-11-22 03:44

    ./src/components/BusinessesList.js
    Line 51:  React Hook useEffect has a missing dependency: 'fetchBusinesses'.
    Either include it or remove the dependency array  react-hooks/exhaustive-deps
    

    It's not JS/React error but eslint (eslint-plugin-react-hooks) warning.

    It's telling you that hook depends on function fetchBusinesses, so you should pass it as dependency.

    useEffect(() => {
      fetchBusinesses();
    }, [fetchBusinesses]);
    

    It could result in invoking function every render if function is declared in component like:

    const Component = () => {
      /*...*/
    
      //new function declaration every render
      const fetchBusinesses = () => {
        fetch('/api/businesses/')
          .then(...)
      }
    
      useEffect(() => {
        fetchBusinesses();
      }, [fetchBusinesses]);
    
      /*...*/
    }
    

    because every time function is redeclared with new reference

    Correct way of doing this stuff is:

    const Component = () => {
      /*...*/
    
      // keep function reference
      const fetchBusinesses = useCallback(() => {
        fetch('/api/businesses/')
          .then(...)
      }, [/* additional dependencies */]) 
    
      useEffect(() => {
        fetchBusinesses();
      }, [fetchBusinesses]);
    
      /*...*/
    }
    

    or just defining function in useEffect

    More: https://github.com/facebook/react/issues/14920

提交回复
热议问题