useEffect
O que é?
É uma função nativa do React adicionada na versão 16.8.0, popularmente conhecida como hook de efeito. É uma funcionalidade recente, logo códigos legados normalmente ainda não a utilizam.
O que faz?
Funciona de forma similar aos life cycle methods dos componentes de classe, ou seja, executa trechos de código após o componente ser montado, sofrer atualizações e/ou ser desmontado.
O useEffect() foi criado justamente para permitir que componentes funcionais pudessem ter acesso aos métodos de ciclo de vida dos componentes de classe, sendo assim, esse hook pode ser comparado a um compilado de todos os métodos em uma única função.
Sintaxe
O useEffect() possui diversas peculiaridades em sua sintaxe que alteram seu comportamento, porém sua estrutura mais básica consiste em uma função que pode receber até dois parâmetros, sendo o primeiro uma callback e o segundo um Array de controle.
A callback será a função a ser executada sempre que o efeito executado corresponder ao efeito esperado. Definimos o efeito que acionará a callback através do segundo parâmetro, o Array de controle, nele iremos passar todos os estados a serem monitorados, assim sempre que o estado monitorado sofrer um efeito, o useEffect() será disparado.
useEffect(() => {});
useEffect(() => {}, []);
useEffect(() => {}, [someVariable, otherVariable, anotherVariable]);
useEffect > Life Cycle Methods
componentDidMount
Para criarmos um useEffect() com funcionalidade similar ao componentDidMount() devemos passar um Array vazio como segundo parâmetro, assim a callback só será disparada uma única vez, quando o componente for montado.
useEffect(() => {}, []);
componentDidUpdate
Essa é a funcionalidade padrão do useEffect(), se chamarmos o hook sem passarmos o Array de controle, a callback será disparada sempre que uma alteração ocorrer, o que pode gerar perda de performance, além de loops infinitos.
Outra forma de “simularmos” o componentDidUpdate() é passarmos o estado que gostaríamos que fosse monitorado como valor do nosso Array de controle, assim a callback somente será disparada quando o estado, definido por nós, sofrer alteração.
useEffect(() => {});
useEffect(() => {}, [someVariable]);
Lembrando que nunca podemos alterar o estado que está sendo monitorado através da callback do useEffect(), pois isso gerará um loop infinito.
ComponentWillUnmount
Diferente dos outros métodos de ciclo de vida, esse não tem relação com o Array de controle, tudo que precisamos fazer é retornar uma função dentro da callback do useEffect().
useEffect(() => {
  return () => {}
});
Hooks Customizados
O que é?
São funções criadas por nós que tem como diferencial atuarem como hooks.
O que faz?
Os hooks customizados servem para encapsular e permitir a reutilização da lógica, assim como funções puras. Logo seu uso é incentivado, sendo inicialmente difícil saber quando devemos customizar um hook, mas a regra em geral é a mesma que para funções:
"A lógica se repete várias vezes em diferentes componentes? Então é uma boa ideia personalizar o hook.”
Sintaxe
Por se tratar de algo “customizável” sua sintaxe é muito volátil e varia de acordo com o objetivo do hook. Porém sua sintaxe mais básica é constituída de pelo menos um useState() e um useEffect(), sendo que, o retorno desse tipo de hook deve conter todas as informações que desejamos reutilizar, isso inclui a informação para leitura, bem como a função para modificação dessa informação.
function useHookCustomizada(defaultValue) {
  const [data, setData] = useState(defaultValue);
  const [loading, setLoading] = useState(false);
  const getData = async () => {
    const res = await fetch('url');
    const data = await res.json();
    setData(data);
  }
  useEffect(() => {
    setLoading(true);
    getData();
    setLoading(false);
  }, []);
  return data;
}
No exemplo acima temos um hook customizado genérico, onde será feito uma requisição a uma API qualquer e os dados retornados serão disponibilizados.
 

 
    
Top comments (1)
Sensacional, principalmente os hooks customizados. Não tinha conseguido entender a essência dos custons hooks, mas agora que peguei a lógica fica mais simples de implementar.