React: errori da non fare utilizzando gli hook

Foto di Steve Johnson su Unsplash

L’introduzione degli hook di React ha semplificato e reso più leggibile gran parte del codice di React. Gli hook sono delle funzioni JavaScript ma hanno delle regole ben precise che vanno rispettate per evitare di incappare in errori.

Vediamone alcuni assieme.

Indice dei contenuti

Utilizzare gli hook fuori da funzioni di React

L’errore che di solito appare in console è:

Invalid hook call. Hooks can only be called inside of the body of a function component. This could happen for one of the following reasons... react-hooks/rules-of-hooks

oppure

React Hook "useState" cannot be called inside a callback. React Hooks must be called in a React function component or a custom React Hook function react-hooks/rules-of-hooks

oppure anche

React Hook "useState" is called conditionally. React Hooks must be called in the exact same order in every component render react-hooks/rules-of-hooks

Una volta che iniziamo ad utilizzare gli hook la tentazione di utilizzarli ovunque ci fa pare è forte. Putroppo non possono essere utilizzati fuori da quelli che sono i componenti o funzioni di React.

Possiamo utilizzare gli hook internamente a:

  • Componenti di React
  • Eventuali Hook custom che scriviamo

Codice di esempio: hook dentro una funzione generica

import { useEffect, useState } from 'react';

// funzione di esempio, usa hook ma non potrebbe
const BuggedFunction = () => {
  const [state, setState] = useState(0);

  return state
}

function App() {
  useEffect(() => {
    BuggedFunction() // invoco la funzione
  }, [])

  return (
    <div className="App">
      Example component
    </div>
  );
}

export default App;

Risultato nel browser

Invalid hook call. Hooks can only be called inside of the body of a function component. This could happen for one of the following reasons

Utilizzare gli hook dentro loop, funzioni annidate o in modo condizionale

L’errore che di solito appare in console è:

React Hook "useEffect" is called conditionally. React Hooks must be called in the exact same order in every component render. Did you accidentally call a React Hook after an early return?

Gli hook vanno sempre eseguiti nel componente principale, nello stesso ordine e sempre tutti. Questo permette a React di poter conoscere e gestire in modo corretto i vari stati dei componenti tra i vari render che vengono fatti. Cambiando l’ordine o la presenza o meno di un hook rompiamo questa regola e React non sa come gestire questa situazione, emettendo l’errore in console.

Codice di esempio: hook dentro un hook

function App() {
  useEffect(() => {
    const [state, setState] = useState(0); // hook dentro un hook
  }, [])

  return ( 
    <div className="App">
      Example component
    </div>
  );
}

Risultato nel browser

React Hook "useState" cannot be called inside a callback. React Hooks must be called in a React function component or a custom React Hook function  react-hooks/rules-of-hooks

Codice di esempio: hook condizionale

function App(props) {
  if (props.variable) { // richiamo un hook in base al valore di una variabile
    const [state, setState] = useState(0);
  }

  return ( 
    <div className="App">
      Example component
    </div>
  );
}

Risultato nel browser

React Hook "useState" is called conditionally. React Hooks must be called in the exact same order in every component render  react-hooks/rules-of-hooks

Conclusioni

Gli errori visti sopra sono abbastanza chiari e i messaggi che appaiono in console indicano correttamente a che punto del codice è avvenuto uno specifico errore.

Inoltre, sempre nella console del browser, trovare sotto questi errori i riferimenti alla guida ufficiale di React.

L’importante e iniziare con calma a leggere e comprendere i messaggi.