Skip to main content

useRef

O useRef é um hook do React que cria uma referência mutável que persiste entre renderizações do componente. Ele é muito útil para acessar elementos do DOM diretamente, armazenar valores sem disparar re-renderizações ou até manter estados anteriores.

Vamos ver isso na prática com um exemplo de Formulário de Venda para Lojas, onde usaremos useRef para focar automaticamente no campo de produto e resetar os campos após uma venda ser concluída!

Exemplo prático — Formulário de Venda 🛒

useRef
import React, { useRef, useState } from 'react';

function SalesForm() {
const productRef = useRef(null);
const quantityRef = useRef(null);
const priceRef = useRef(null);
const [sales, setSales] = useState([]);

const handleSale = (e) => {
e.preventDefault();
const product = productRef.current.value;
const quantity = quantityRef.current.value;
const price = priceRef.current.value;

if (product && quantity && price) {
setSales((prevSales) => [
...prevSales,
{
id: prevSales.length + 1,
product,
quantity: Number(quantity),
total: Number(quantity) * Number(price),
},
]);

// Limpar os campos
productRef.current.value = '';
quantityRef.current.value = '';
priceRef.current.value = '';

// Focar novamente no campo de produto
productRef.current.focus();
}
};

return (
<div>
<h2>Formulário de Venda 🛍️</h2>
<form onSubmit={handleSale}>
<div>
<label>Produto:</label>
<input ref={productRef} type="text" placeholder="Nome do produto" />
</div>
<div>
<label>Quantidade:</label>
<input ref={quantityRef} type="number" placeholder="Quantidade" />
</div>
<div>
<label>Preço Unitário:</label>
<input ref={priceRef} type="number" placeholder="Preço unitário" step="0.01" />
</div>
<button type="submit">Registrar Venda</button>
</form>

<h3>Vendas Registradas 📋</h3>
<ul>
{sales.map((sale) => (
<li key={sale.id}>
{sale.quantity}x {sale.product} — Total: R$ {sale.total.toFixed(2)}
</li>
))}
</ul>
</div>
);
}

Como funciona o useRef?

No exemplo, usamos useRef para criar referências diretas para os campos do formulário. Quando o usuário clica em Registrar Venda, capturamos os valores diretamente dos inputs sem depender de useState para cada campo. Isso nos permite:

  • Manipular o DOM diretamente: Pegamos os valores com inputRef.current.value.
  • Resetar os campos: Após registrar a venda, limpamos os campos diretamente alterando o valor da referência.
  • Melhorar a usabilidade: Usamos productRef.current.focus() para devolver o foco ao campo de produto, agilizando o cadastro de múltiplas vendas.

Quando usar useRef?

O useRef é ideal para:

  • Acessar elementos do DOM diretamente (inputs, botões, etc.).
  • Armazenar valores mutáveis sem re-renderizar o componente, como contadores ou timers.
  • Manter referências entre renderizações, como para manipular animações ou guardar valores antigos de estado.

Limitações do useRef

Embora útil, o useRef não dispara re-renderizações quando o valor da referência muda. Se você precisa atualizar a interface com base no valor, o ideal é usar useState.

Além disso, manipular diretamente o DOM pode quebrar a mentalidade declarativa do React, então é bom usar useRef com moderação e sempre que realmente fizer sentido!

Conclusão

O useRef é um hook essencial para manipular elementos do DOM e manter valores entre renderizações sem afetar o ciclo de re-renderização do React. No nosso formulário de venda, ele simplificou a captura de valores, permitiu limpar os campos e manteve a experiência do usuário mais fluida ao focar automaticamente no próximo campo de venda.

Se você estiver construindo formulários interativos, controles de mídia ou recursos que envolvam manipulação direta do DOM, o useRef pode ser a ferramenta perfeita para tornar sua aplicação mais dinâmica e eficiente.

tip

Conheça mais sobre os hooks em:

Referências: