React Hook - useRef
O useRef
é um React Hook que fornece uma maneira de interagir com elementos do DOM e persistir valores entre re-renderizações sem acionar uma nova renderização. Este Hook é útil para acessar e manipular diretamente elementos do DOM (como se fosse utilizar o document.querySelector
), bem como para armazenar valores que precisam persistir ao longo do ciclo de vida de um componente sem causar uma nova renderização quando são modificados.
Sintaxe
A sintaxe básica do useRef
envolve a criação de um objeto de referência (ref
) usando o Hook, que pode ser utilizado para armazenar referências a elementos do DOM ou valores persistentes.
import React, { useRef, useEffect } from 'react';
const MeuComponente = () => {
const meuRef = useRef(null);
// Utilizar a ref para acessar um elemento do DOM
useEffect(() => {
if (meuRef.current) {
console.log('Elemento do DOM:', meuRef.current);
}
}, []);
return (
<div ref={meuRef}>
{/* Conteúdo do componente */}
</div>
);
};
Neste exemplo, meuRef
é criado usando useRef
e associado ao elemento <div>
usando a propriedade ref
. A ref
é então utilizada dentro de um useEffect
para acessar o elemento do DOM após a renderização.
Caso de uso
Um caso de uso comum do useRef
é acessar e interagir com elementos do DOM, especialmente em operações que não precisam acionar uma nova renderização. Por exemplo, ao manipular o foco de um campo de entrada:
import React, { useRef, useEffect } from 'react';
const CampoDeEntrada = () => {
const inputRef = useRef(null);
// Efeito para focar no campo de entrada ao montar o componente
useEffect(() => {
if (inputRef.current) {
inputRef.current.focus();
}
}, []);
return <input ref={inputRef} />;
};
Neste exemplo, a ref inputRef
é utilizada para acessar e focar no campo de entrada sem acionar uma nova renderização.
Manipulando valores persistentes
O useRef
também pode ser utilizado para armazenar valores que precisam persistir entre re-renderizações sem causar uma nova renderização quando são modificados. Diferentemente do estado (useState), a alteração de um valor em uma ref
não desencadeia uma renderização.
import React, { useRef, useEffect } from 'react';
const MeuComponente = () => {
// Criar uma ref para armazenar um valor persistente
const contadorRef = useRef(0);
useEffect(() => {
console.log('Contador:', contadorRef.current);
}, [contadorRef.current]);
const incrementar = () => {
contadorRef.current += 1;
};
return (
<div>
<p>Contador: {contadorRef.current}</p>
<button onClick={incrementar}>Incrementar</button>
</div>
);
};
No exemplo acima, contadorRef
é utilizado para armazenar um valor persistente (0
) que não aciona uma nova renderização quando é incrementado.