hidden: true
React Hooks essenciais
useState — Estado do componente
const [count, setCount] = useState(0);
const [name, setName] = useState("");
const [items, setItems] = useState<string[]>([]);
// Atualizar
setCount(count + 1);
setCount((prev) => prev + 1); // Melhor para updates baseados no estado anterior
setItems((prev) => [...prev, "novo item"]);useEffect — Efeitos colaterais
// Roda quando o componente monta
useEffect(() => {
fetchData();
}, []);
// Roda quando uma dependência muda
useEffect(() => {
fetchUser(userId);
}, [userId]);
// Cleanup (quando o componente desmonta)
useEffect(() => {
const interval = setInterval(() => tick(), 1000);
return () => clearInterval(interval);
}, []);useRef — Referências e valores persistentes
// Referenciar elemento DOM
const inputRef = useRef<HTMLInputElement>(null);
inputRef.current?.focus();
// Valor que persiste entre renders sem causar re-render
const renderCount = useRef(0);
renderCount.current++;useMemo — Cálculos pesados cacheados
const filteredItems = useMemo(() => {
return items.filter((item) => item.name.includes(search));
}, [items, search]);useCallback — Funções cacheadas
const handleClick = useCallback(
(id: string) => {
deleteItem(id);
},
[deleteItem],
);Custom Hooks
Extraia lógica reutilizável:
function useLocalStorage<T>(key: string, initialValue: T) {
const [value, setValue] = useState<T>(() => {
if (typeof window === "undefined") return initialValue;
const stored = localStorage.getItem(key);
return stored ? JSON.parse(stored) : initialValue;
});
useEffect(() => {
localStorage.setItem(key, JSON.stringify(value));
}, [key, value]);
return [value, setValue] as const;
}
// Uso
const [theme, setTheme] = useLocalStorage("theme", "dark");function useDebounce<T>(value: T, delay: number): T {
const [debounced, setDebounced] = useState(value);
useEffect(() => {
const timer = setTimeout(() => setDebounced(value), delay);
return () => clearTimeout(timer);
}, [value, delay]);
return debounced;
}
// Uso
const debouncedSearch = useDebounce(search, 300);Dica
Em Server Components do Next.js, você NÃO usa hooks. Hooks são apenas para Client Components ("use client").