E aí, programador! o/
Nessa aula você irá conhecer mais um hook do React, o useRef().
Ele é parecido com o useState(), mas serve para algo um pouco mais específico e menos comum, mas também é bem importante conhecê-lo. O useRef() é capaz de persistir valores entre as renderizações do componente, como o useState(), mas mudar o valor da ref criada não irá causar uma nova renderização.
Para demonstrar o useRef() vamos criar um novo projeto com o VIte.
Nesse novo projeto, remova todo o conteúdo desnecessário de boas-vindas.
Crie no componente App.jsx os elementos abaixo para ver como o useRef se compara a uma variável comum do JavaScript e a um estado criado com useState():
import { useRef, useState } from "react";
import RefExample from "./RefExample";
function App() {
let variable = 0
const ref = useRef(0);
let [state, setState] = useState(0);
const showValues = () => {
alert(`
Variável: ${variable}
Ref: ${ref.current}
State: ${state}
`)
}
return (
<div>
<p>Variável: {variable}</p>
<p>Ref: {ref.current}</p>
<p>State: {state}</p>
<button onClick={() => variable++}>Aumentar Variável</button>
<button onClick={() => ref.current++}>Aumentar Ref</button>
<button onClick={() => setState(state => state + 1)}>Aumentar State</button>
<button onClick={showValues}>Exibir valores</button>
<hr />
<RefExample />
</div>
);
}
export default App
Agora vamos a um dos casos de uso mais comuns do useRef(), referenciar elementos do DOM diretamente. Crie um componente RefExample.jsx e adicione o seguinte conteúdo:
Obs.: repare que, como o valor é persistido entre as renderizações, a referência ao elemento do DOM se mantém, o que é útil para quando queremos manipulá-lo diretamente, não precisando selecioná-lo novamente a cada nova renderização.
import { useRef } from 'react';
const RefExample = () => {
const inputRef = useRef(null);
const handleClick = () => {
inputRef.current.focus();
inputRef.current.style.backgroundColor = "#f64348"
};
return (
<div>
<input ref={inputRef} type="text" />
<button onClick={handleClick}>Focar</button>
</div>
);
};
export default RefExample;