Коротка відповідь
middleReact Hook — це функція, що дозволяє використовувати state і життєвий цикл компоненту у функціональних компонентах. При виклику Hook React зберігає внутрішнє значення між рендерингами, а оновлення state тригерить повторний рендер. Hook працює лише у верхньому рівні компоненту, щоб гарантувати стабільність порядку викликів.
Повне пояснення
Що це і навіщо
React Hook – це API, що дозволяє функціональним компонентам мати state, обробляти побічні ефекти та інші можливості класових компонентів. Це зменшує потребу у класах і полегшує реюзабельність логіки.
Ключові принципи
- Функція: Hook – це звичайна функція, що починається з
use. - Порядок викликів: Hook мають бути викликані у верхньому рівні компоненту, не всередині умов чи циклів.
- State‑світ: React зберігає внутрішнє значення Hook між рендерингами.
- Повторний рендер: Оновлення state через
setState(наприклад,useState) викликає повторний рендер.
Як це працює
- Під час першого рендеру React створює внутрішню структуру для кожного Hook.
- При наступних рендерах React ідентифікує Hook за їх порядком виклику.
- Якщо значення state змінюється, React планує новий рендер.
Практика і реалізація
import { useState, useEffect } from 'react';
function Counter() {
const [count, setCount] = useState(0);
useEffect(() => {
document.title = `Count: ${count}`;
}, [count]);
return <button onClick={() => setCount(c => c + 1)}>Increment</button>;
}
Тестування
- Unit:
jest+@testing-library/react-hooksдля перевірки state. - Integration:
react-testing-library+user-eventдля симуляції кліків.
Безпека та оптимізація
- Використовуйте
useCallback/useMemo, щоб уникнути зайвих рендерів. - Переконайтеся, що Hook не викликаються умовно – це запобігає помилкам типу "React Hook has been called in a different order".
Особливості в контексті React
- Custom Hooks: дозволяють інкапсулювати логіку і повторно використовувати її.
- React 18: підтримка
useSyncExternalStoreдля синхронного читання зовнішніх станів.
Типові помилки
- Виклик Hook у циклі → "React Hook has been called in a different order".
- Використання
thisу функціональному компоненті → не підтримується. - Зміна порядку Hook між рендерами → непередбачувана поведінка.
- Необхідність
useEffectбез залежностей → нескінченний цикл рендеру. - Відсутність
keyу списку → React не може правильно відстежувати елементи. - Перевантаження state у великому компоненті → погана продуктивність.
- Використання
useStateз об'єктом без копіювання → мутування стану. - Необхідність
useRefдля DOM‑елементів → неправильне оновлення.
Cheatsheet
useState(initial)– state + setter.useEffect(fn, deps?)– побічний ефект.useContext(ctx)– доступ до контексту.useReducer(reducer, init)– складний state.useRef(initial?)– мутоване значення, не викликає рендер.useMemo(fn, deps)– мемоізація значення.useCallback(fn, deps)– мемоізація функції.