E aí, programador! o/
Agora que você já viu o que é e como usar o state do React você irá entender melhor o que são os hooks do React.
E para iniciar, vamos criar um novo projeto com o Vite. Agora já temos os conhecimentos necessários para entender a tela de “boas-vindas” do Vite e o exemplo do contador.
Essa será um pouco mais explicativa, sem muito código. A ideia é entender 2 regras muito importantes do useState e dos hooks em geral.
Com isso chegamos à primeira regra dos hooks: você só pode chamar um hook em uma função que é um componente React, você não pode chamar hooks em funções comuns do JavaScript.
Você pode criar seus próprios hooks seguindo o padrão de nomenclatura e retornar valores. O seu hook será uma função, mas que você também só deverá chamar dentro de um componente React.
Crie uma pasta “hooks” e dentro dela um arquivo “useCounter.js” com a seguinte função:
import { useState } from "react";
export default function useCounter() {
const [count, setCount] = useState(0)
const increment = () => {
setCount(count + 1)
}
return { count, increment }
}
Agora, no componente “App.jsx” podemos usar o nosso custom hook:
import './App.css'
import useCounter from './hooks/useCounter'
function App() {
const { count, increment } = useCounter()
return (
<>
<h1>Vite + React</h1>
<div className="card">
<button onClick={increment}>
count is {count}
</button>
</div>
</>
)
}
export default App
Uma prática comum no React é criar hooks customizados para abstrair certos comportamentos e lógicas fora do componente, o que resulta em uma estrutura muito mais organizada.
O React monitora os hooks através de uma lista, ele não sabe o nome que demos para eles ou onde e como estamos trabalhando com eles. Por isso, a ordem em que usamos os hooks no componente importa (e muito). O que nos leva à segunda regra.
A segunda regra é que você só pode chamar um hook no top-level da função, nunca deverá chamar os hooks dentro de blocos condicionais, repetições ou outros funções criadas dentro do componente.
Por causa da forma como o React lida com os hooks é necessário que a ordem e a quantidade dos hooks em um componente sejam sempre as mesmas. Se tentarmos colocar o hook dentro de uma condicional veremos que isso causará vários erros:
function App() {
const { count, increment } = useCounter()
let someState
if (count > 10) {
someState = useState("MAIOR QUE 10")
}
return (
<>
<h1>Vite + React {someState}</h1>
<div className="card">
<button onClick={increment}>
count is {count}
</button>
</div>
</>
)
}
export default App