Como criar um hook customizado
Todo programador busca escrever um código que seja reutilizável da melhor maneira. Sobre o desenvolvimento web, mais especificamente em React, os Hooks nos oferecem a opção de alterar estados e ciclo de vida a partir de componentes funcionais.
Neste artigo, vamos falar um pouco sobre o que são hooks e como criar um personalizado ao seu projeto.
Hooks
O que são?
Implementados na versão 16.8.0, os Hooks permitiram utilizar diversos recursos por meio de funções de uma forma simples, deixando de lado o uso de classes para acessar funcionalidades do React.
Os Hooks permitem reutilizar uma mesma funcionalidade diversas vezes na aplicação. Desta forma, fornecem uma maneira mais simples e concisa de lidar com o estado e o ciclo de vida em componentes funcionais, tornando o código mais legível e mais fácil de manter.
Hooks mais utilizados
useState
É usado para adicionar estado a componentes funcionais, ou seja, permite adicionar uma variável de estado ao seu componente. Ele retorna um par de valores: o estado atual e uma função para atualizá-lo. Exemplo:
useEffect
O useEffect permite executar efeitos colaterais no código. Ele é usado para lidar com tarefas assíncronas, integração com APIs externas, manipulação de eventos, entre outros. Exemplo:
Neste exemplo, o título do documento tornou-se uma mensagem customizada, informando o número de cliques do botão.
useRef
Esse hook permite criar uma referência mutável que persiste entre renderizações. Pode ser usado para acessar o DOM diretamente ou para armazenar um valor imutável durante o ciclo de vida do componente. No exemplo abaixo, criamos a referência ao elemento da DOM utilizando o useRef. Esta referência é utilizada para focar o elemento quando o botão for clicado.
useContext
Esse hook permite que você acesse o contexto de um componente, com o objetivo de compartilhar dados globalmente, sem precisar passar props manualmente através de cada nível. Veja o exemplo abaixo:
Primeiramente, cria-se o contexto por meio da função createContext. Ele terá o estado que será compartilhado entre componentes. Em seguida, o contexto é importado nos componentes que precisam acessar o estado global. Por fim, na função App, os componentes (handleCount e handleButton) são envolvidos pelo provedor criado para compartilhar o estado global.
O estado count pode ser compartilhado entre os componentes handleCount e handleButton, evitando a necessidade de passar props manualmente entre os componentes pais e filhos.
useCallback
Utilizado para evitar a criação de novas funções em cada renderização, especialmente quando essas funções são passadas como props para componentes filhos, otimizando o desempenho.
Neste exemplo, o useCallback é usado para memorizar a função handleFilterChange, que é responsável por atualizar o estado filterText com base no texto digitado pelo usuário. Sem o useCallback, a função handleFilterChange seria recriada a cada renderização do componente FilteredList, o que poderia levar a re-renderizações desnecessárias do componente.
Por que hook customizado?
O uso de hooks customizados no React oferece diversas vantagens para a aplicação. A reutilização de lógica é um dos principais pontos, pois a criação de hooks personalizados permite encapsular uma lógica complexa em um único lugar. Isso facilita a reutilização dessa lógica em vários componentes, evitando a duplicação de código.
Quando encapsulamos detalhes complexos de implementação nos hooks customizados, conseguimos deixar uma interface mais simples e clara para os componentes que os utilizam.
Além disso, quando for preciso modificar o código do hook, somente um único local precisará de alteração. Isso facilita a manutenção e reduz a chance de introduzir erros ao atualizar várias partes do código.
Vamos à prática!
- Configurações iniciais do projeto
Vamos iniciar o projeto do zero. Crie uma pasta onde ele será armazenado. Aqui iremos nomear como custom-hook. Em seu terminal, rode o seguinte código:
Em seguida:
Uma nova janela irá se abrir em seu navegador, como mostrado na figura abaixo.
Agora, iremos fazer a organização das nossas pastas e arquivos. Neste ponto, você deve estar com a seguinte estrutura de pastas:
Podemos deletar os seguintes arquivos:
- Na pasta public:
- logo192.png e logo512.png;
- manifest.json;
- robots.txt.
- Na pasta src iremos apagar todos, exceto o index.js e App.js;
Mais alguns ajustes precisam ser feitos:
- Na pasta public, em index.html: retire os comentários e referências das imagens que apagamos.
- Na pasta src:
- Crie uma nova pasta chamada pages;
- Na pasta pages, adicione um novo arquivo Home.js com o seguinte trecho:
- Crie mais dois arquivos na pasta pages, denominados About.js e Contact.js. Eles terão o seguinte conteúdo:
About.js
Contac.js
- No arquivo App.js, que está em src, deixe somente o seguinte código:
- E por fim, modifique o arquivo index.js:
Com isso, não teremos mais nenhum erro no terminal:
Suas pastas e arquivos estão com esta estrutura agora:
E sua página estará com esta cara inicial:
2. Roteamento
Precisaremos instalar o react-router-dom, que será a biblioteca responsável pelo roteamento das nossas páginas. No terminal, rode:
Com o react-router-dom instalado, vamos importá-lo no nosso App.js, juntamente com nossas pages. As importações ficarão assim:
O BrowserRouter é o responsável pelo roteamento, ficando por volta das rotas do projeto. Por convenção, ele é renomeado como Router. O Route são as rotas propriamente ditas, e o Routes é quem descreve as rotas, ficando por volta delas.
Agora, iremos adicionar as rotas de cada página:
O Route apresenta dois parâmetros: o path e o element. O path é a localização que o usuários irá utilizar para acessar aquela página. No element, terá o componente que será renderizado para aquela rota, no caso serão a Home, About e Contact.
3. Desenvolvendo o Hook
Dentro de src, crie uma pasta chamada hooks. Dentro desta nova pasta, vamos criar um arquivo chamado usePath.js, no qual iremos desenvolver nosso hook customizado.
A ideia deste hook é verificar em qual página o usuário se encontra e obter o path dela. Para obter este parâmetro, vamos utilizar useLocation, que é um hook nativo do React. O usePath ficará da seguinte forma:
Iremos desestruturar o useLocation para utilizar somente o pathname. Utilizaremos a variável isHome como uma flag. Caso o usuário esteja na página Home, a variável isHome será true. Do contrário, ela será false.
Assim, basta importar o nosso hook nas nossas páginas e elaborar a lógica. O código em cada página ficará:
Home.js
About.js
Contact.js
Importamos o hook usePath em cada page e desestruturamos para ter acesso a variável isHome. Adicionamos um ternário para a lógica de verificação da rota. Caso esteja na home a frase em verde ‘Você está na página principal’ irá aparecer. Se não, a frase em vermelho ‘Você não está na página principal’ será renderizada na tela.
Nossa resultado final:
Conclusão
Neste artigo, abordamos sobre os hooks, que são ferramentas muito utilizadas no React. Vimos também alguns hooks nativos do React e como desenvolver um hook customizado. Criar um hook personalizado à sua aplicação oferece várias vantagens, dentre elas, tem-se a melhora na organização, reutilização e legibilidade do seu código.
A Revelo Content Network acolhe todas as raças, etnias, nacionalidades, credos, gêneros, orientações, pontos de vista e ideologias, desde que promovam diversidade, equidade, inclusão e crescimento na carreira dos profissionais de tecnologia.