J

React Hooks

0 views

O que são os hooks?

Segundo a documentação oficial do React:

Hooks são uma nova adição no React 16.8. Eles permitem que você use o state e outros recursos do React sem escrever uma classe.

Os hooks vieram para facilitar a criação e manutenção de componentes no React, abaixo vamos entender quais são os hooks mais comuns, seus conceitos e como aplicar na prática.


Hooks mais comuns

Nesse artigo vou abordar os 2 hooks mais comuns no React:

  • useState
  • useEffect

useState

Esse hook é responsável pela criação e atualização de um estado local.

No exemplo abaixo criei um botão que altera o background-color de uma div.

import { useState } from "react";

const containerStyles = {
  "border-radius": "50%",
  width: "20px",
  height: "20px",
};

const State = () => {
  const [color, updateColor] = useState("#000000");

  function generateColor() {
    return (
      "#" + ((Math.random() * 0xffffff) << 0).toString(16).padStart(6, "0")
    );
  }

  function setColor() {
    const newColor = generateColor();
    updateColor(newColor);
  }

  return (
    <div>
      <button
        onClick={() => {
          setColor();
        }}
      >
        Atualizar cor
      </button>
      <div
        style={{
          backgroundColor: color,
          ...containerStyles,
        }}
        className="round-color"
      />
    </div>
  );
};

export default State;

O primeiro passo é importar o useState dentro do componente.

import { useState } from "react";

Depois de importar, iremos definir a variável reativa responsável pela mudança da cor da div.

const [color, updateColor] = useState("#000000");

Na linha 18 criei uma função que recebe a cor gerada pela função generateColor() e atualizo o valor da variável color, já na linha 26 eu chamo o evento onClick que chama a função setColor() que irá alterar a variável color.

function setColor() {
    const newColor = generateColor();
    updateColor(newColor);
  }

  return (
    <div>
      <button
        onClick={() => {
          setColor();
        }}
      >
        Atualizar cor
      </button>
      <div
        style={{
          backgroundColor: color,
          ...containerStyles,
        }}
        className="round-color"
      />
    </div>
  );

useEffect

Esse hooks serve para lidar com efeitos do ciclo de vida, como: componentDidMount, componentDidUpdate e componentWillUnmount, ou seja, ele é realizado quando:

  • Quando o componente renderiza pela primeira vez;
  • Quando o valor da dependência é atualizado;
  • Quando o componente é desmontado.

No exemplo abaixo vou mostrar a hora atual atualizando a cada segundo.

import { useState, useEffect } from "react";

const Effect = () => {
  const date = new Date();
  const localeTime = date.toLocaleTimeString();

  const [time, setTime] = useState(localeTime);

  useEffect(() => {
    const timer = setTimeout(() => setTime(localeTime), 1000);

    return () => clearTimeout(timer);
  }, [localeTime]);

  return <time>{time}</time>;
};

export default Effect;

Primeiro importamos o useEffect junto do useState.

import { useState, useEffect } from "react";

Aqui chamamos a função useEffect, ela recebe 2 parâmetros, o primeiro é uma callback, que vai ser executada em algum dos ciclos de vida, o segundo é um array de dependências que recebe às variáveis que irão ser atualizadas, nesse caso, sempre que localeTime for alterada, ele vai chamar o useEffect.

useEffect(() => {
    const timer = setTimeout(() => setTime(localeTime), 1000);

    return () => clearTimeout(timer);
  }, [localeTime]);

Para executar o useEffect só uma vez ou quando ele for renderizado, deixamos o segundo parâmetro que é o array de dependências vazio.

import { useEffect } from 'react'

const App = () => {
  useEffect(() => {
     console.log('App started')
  }, [])
}

export default App

Para executar o useEffect quando o componente é atualizado, adicionamos a variável a ser observada como dependência. Já para executar antes do componente ser desmontado, retornamos uma função que irá ser executada.

useEffect(() => {
  const timer = setTimeout(() => setTime(localeTime), 1000);


  // Aqui fazemos a limpeza do setTimeout antes do componente ser desmontado.
  return () => clearTimeout(timer);

  // Adicionamos a variável localeTime no array de depedências, agora sempre que ela atualizar, vai chamar o useEffect
}, [localeTime]);

Conclusão

Vemos um uso dos 2 hooks mais comuns, talvez no futuro eu traga explicação sobre os outros hooks do React.

Documentação oficial