React Hooks
React Hooks são funções especiais introduzidas na versão 16.8 do React, que permitem o uso de recursos de estado e ciclo de vida em componentes funcionais. Antes dos Hooks, esses recursos eram disponíveis apenas em componentes de classe. Os Hooks proporcionam uma maneira mais simples e concisa de reutilizar a lógica estateful entre componentes, sem a necessidade de modificar a hierarquia de componentes.
O que são Hooks?
[editar | editar código-fonte]Hooks são funções que "se conectam" aos recursos de estado e ciclo de vida do React a partir de componentes funcionais. Eles permitem que você use estado, execute efeitos colaterais e acesse outros recursos do React sem escrever uma classe. Os Hooks são uma adição ao React e não substituem completamente os componentes de classe, mas fornecem uma alternativa mais flexível e modular para gerenciar o estado e os efeitos colaterais.
Regras dos Hooks
[editar | editar código-fonte]Ao usar Hooks, é importante seguir duas regras principais:
- Apenas chame Hooks no nível superior: Não chame Hooks dentro de loops, condicionais ou funções aninhadas. Os Hooks devem ser chamados no nível superior do componente funcional para garantir que sejam chamados na mesma ordem a cada renderização.
- Apenas chame Hooks de componentes funcionais: Não chame Hooks de funções JavaScript regulares. Os Hooks devem ser chamados apenas de componentes funcionais do React ou de custom Hooks.
Hooks Básicos
[editar | editar código-fonte]O React fornece alguns Hooks básicos que cobrem a maioria dos casos de uso comuns. Aqui estão os principais Hooks básicos:
useState
[editar | editar código-fonte]O Hook useState é um dos Hooks básicos fornecidos pelo React, permitindo adicionar estado a um componente funcional sem a necessidade de convertê-lo em um componente de classe. O useState é usado quando você precisa armazenar e atualizar valores dentro de um componente. A sintaxe básica do useState é a seguinte:
const [state, setState] = useState(initialValue);
Aqui, state
é o nome da variável de estado que você deseja declarar e pode ter qualquer nome você escolher, setState
é uma função que permite atualizar o valor do estado, aceitando um novo valor e enfileirando uma nova renderização do componente, e initialValue
é o valor inicial do estado, podendo ser de qualquer tipo, como um número, uma string, um objeto ou um array.
Vejamos um exemplo simples de como usar o useState para criar um contador:
import React, { useState } from 'react';
function Counter() {
const [count, setCount] = useState(0);
return (
<div>
<p>Você clicou {count} vezes</p>
<button onClick={() => setCount(count + 1)}>
Clique aqui
</button>
</div>
);
}
export default Counter;
Neste exemplo, importamos o Hook useState do pacote 'react', declaramos uma variável de estado chamada count
e uma função setCount
para atualizá-la, usando a desestruturação de array, com o valor inicial do count
definido como 0. No JSX retornado, exibimos o valor atual do count
usando {count}
e, quando o botão é clicado, a função setCount
é chamada com um novo valor, incrementando o count
em 1, fazendo com que o React atualize automaticamente a interface do usuário para refletir o novo valor do estado.
Ao atualizar o estado usando a função setState
, você pode passar um novo valor diretamente, como setCount(count + 1)
, ou usar uma função de atualização que recebe o valor anterior do estado como argumento e retorna o novo valor, como setCount(prevCount => prevCount + 1)
, sendo essa última abordagem útil quando o novo valor do estado depende do valor anterior.
Além disso, você pode usar o useState várias vezes em um único componente para declarar múltiplas variáveis de estado independentes, como:
const [count, setCount] = useState(0);
const [name, setName] = useState('');
const [isLoggedIn, setIsLoggedIn] = useState(false);
useEffect
[editar | editar código-fonte]O Hook useEffect é outro Hook fundamental fornecido pelo React, permitindo que você execute efeitos colaterais em componentes funcionais. Efeitos colaterais podem incluir coisas como buscar dados de uma API, subscrever eventos, modificar o DOM ou qualquer outra operação que possa afetar o estado do componente ou interagir com o mundo externo. O useEffect combina os métodos de ciclo de vida componentDidMount, componentDidUpdate e componentWillUnmount encontrados em componentes de classe em uma única API.
A sintaxe básica do useEffect é a seguinte:
useEffect(() => {
// Código do efeito colateral
return () => {
// Código de limpeza (opcional)
};
}, [dependencies]);
O useEffect recebe dois argumentos: uma função de efeito e um array de dependências opcional. A função de efeito é executada após cada renderização do componente, por padrão. Ela pode retornar uma função de limpeza opcional, que é executada antes da próxima execução do efeito ou quando o componente é desmontado. O array de dependências permite especificar valores que, quando alterados, acionam a re-execução do efeito. Vejamos um exemplo de como usar o useEffect para atualizar o título da página com base em um contador:
import React, { useState, useEffect } from 'react';
function Exemplo() {
const [count, setCount] = useState(0);
useEffect(() => {
document.title = `Você clicou ${count} vezes`;
}, [count]);
return (
<div>
<p>Você clicou {count} vezes</p>
<button onClick={() => setCount(count + 1)}>
Clique aqui
</button>
</div>
);
}
export default Exemplo;
Neste exemplo, importamos os Hooks useState e useEffect do pacote 'react'. Declaramos uma variável de estado count usando o useState e inicializamos seu valor como 0. Em seguida, usamos o useEffect para atualizar o título da página sempre que o valor de count for alterado. A função de efeito é definida como () => { document.title =
Você clicou ${count} vezes; }
, que atualiza o título da página com a contagem atual. O array de dependências [count]
especifica que o efeito deve ser re-executado apenas quando o valor de count mudar.
Agora, vamos ver um exemplo de como usar o useEffect para fazer uma chamada à API e atualizar o estado com os dados retornados:
import React, { useState, useEffect } from 'react';
function Exemplo() {
const [data, setData] = useState(null);
useEffect(() => {
fetch('https://api.example.com/data')
.then(response => response.json())
.then(data => setData(data));
}, []);
if (!data) {
return <div>Carregando...</div>;
}
return (
<div>
<h1>{data.title}</h1>
<p>{data.description}</p>
</div>
);
}
export default Exemplo;
Neste exemplo, declaramos uma variável de estado data usando o useState e inicializamos seu valor como null. Dentro do useEffect, fazemos uma chamada à API usando a função fetch. Quando a resposta é recebida, convertemos os dados para o formato JSON e atualizamos o estado data usando a função setData. O array de dependências vazio []
garante que o efeito seja executado apenas uma vez, após a montagem inicial do componente.
No JSX retornado, verificamos se data é nulo. Se for, exibimos uma mensagem de "Carregando...". Caso contrário, renderizamos o título e a descrição obtidos dos dados da API.
Para efeitos didádicos, vamos ver um exemplo de como usar o useEffect para simular uma chamada à API com dados mockados e atualizar o estado com os dados:
import React, { useState, useEffect } from 'react';
function Exemplo() {
const [data, setData] = useState(null);
useEffect(() => {
const mockData = {
title: 'Título do Exemplo',
description: 'Descrição do exemplo usando dados mockados.'
};
setTimeout(() => {
setData(mockData);
}, 1500);
}, []);
if (!data) {
return <div>Carregando...</div>;
}
return (
<div>
<h1>{data.title}</h1>
<p>{data.description}</p>
</div>
);
}
export default Exemplo;
Neste exemplo, declaramos uma variável de estado data usando o useState e inicializamos seu valor como null. Dentro do useEffect, simulamos uma chamada à API usando dados mockados. Declaramos um objeto mockData
que contém um título e uma descrição fictícios. Usamos a função setTimeout
para simular um atraso de 1,5 segundos antes de atualizar o estado data
com os dados mockados.
Como no exemplo anterior, no JSX retornado, verificamos se data é nulo. Se for, exibimos uma mensagem de "Carregando...". Após o atraso simulado, o estado data
é atualizado com os dados mockados e o componente é renderizado novamente, exibindo o título e a descrição.
O useEffect também permite executar uma função de limpeza antes da próxima execução do efeito ou quando o componente é desmontado. Isso é útil para cancelar assinaturas, limpar temporizadores ou liberar recursos. Aqui está um exemplo:
import React, { useState, useEffect } from 'react';
function Exemplo() {
const [count, setCount] = useState(0);
useEffect(() => {
const timer = setInterval(() => {
setCount(prevCount => prevCount + 1);
}, 1000);
return () => {
clearInterval(timer);
};
}, []);
return (
<div>
<p>Contagem: {count}</p>
</div>
);
}
export default Exemplo;
Neste exemplo, usamos o useEffect para configurar um temporizador que incrementa o count a cada segundo. A função de limpeza () => { clearInterval(timer); }
é retornada pelo efeito e é executada quando o componente é desmontado, garantindo que o temporizador seja limpo e evitando vazamentos de memória.
Conclusão
[editar | editar código-fonte]Neste tutorial, exploramos dois Hooks fundamentais fornecidos pelo React: o useState e o useEffect. Esses Hooks permitem adicionar estado e executar efeitos colaterais em componentes funcionais, proporcionando uma maneira mais simples e concisa de lidar com o gerenciamento de estado e o ciclo de vida do componente.
O Hook useState nos permite adicionar estado a um componente funcional, eliminando a necessidade de escrever uma classe. Ele retorna um par contendo o valor do estado atual e uma função para atualizá-lo. Podemos usar o useState para gerenciar qualquer tipo de dado, desde valores primitivos até objetos complexos.
O Hook useEffect, por sua vez, nos permite executar efeitos colaterais em componentes funcionais. Ele combina os métodos de ciclo de vida componentDidMount, componentDidUpdate e componentWillUnmount em uma única API. Com o useEffect, podemos realizar ações como buscar dados de uma API, subscrever eventos, modificar o DOM ou executar qualquer outra operação que possa afetar o estado do componente ou interagir com o mundo externo.
Os Hooks useState e useEffect são apenas dois exemplos dos muitos Hooks disponíveis no React. Existem outros Hooks internos, como useContext, useRef, useMemo e useCallback, que fornecem recursos adicionais para lidar com contexto, referências, memoização e otimização de desempenho. Além disso, o React permite criar Hooks personalizados, possibilitando a reutilização da lógica stateful entre componentes.
Referências
[editar | editar código-fonte]- React.Introdução aos Hooks. Documentação oficial do React. Disponível em: https://pt-br.reactjs.org/docs/hooks-intro.html.
- React. Hooks de Estado. Documentação oficial do React. Disponível em: https://pt-br.reactjs.org/docs/hooks-state.html.
- React. Hooks de Efeito. Documentação oficial do React. Disponível em: https://pt-br.reactjs.org/docs/hooks-effect.html.
- React. Apresentando Hooks. Blog oficial do React. Disponível em: https://pt-br.reactjs.org/blog/2018/11/27/react-16-roadmap.html#introducing-hooks.
- Scrimba. Introdução aos React Hooks. Curso interativo online. Disponível em: https://scrimba.com/learn/reacthooks.
- Web Dev Simplified. React Hooks Explained. Vídeo do YouTube. Disponível em: https://www.youtube.com/watch?v=TNhaISOUy6Q.