Власний хук - функція з назвою на use, що викликає інші хуки. Спосіб винести логіку зі станом і ефектами з компонента й перевикористати.
function useDebouncedValue(value, delay = 300) {
const [debounced, setDebounced] = useState(value);
useEffect(() => {
const id = setTimeout(() => setDebounced(value), delay);
return () => clearTimeout(id);
}, [value, delay]);
return debounced;
}
function Search() {
const [query, setQuery] = useState('');
const debouncedQuery = useDebouncedValue(query);
const results = useSearch(debouncedQuery);
// ...
}
Ключове: хуки ділять логіку, а не стан. Кожен компонент, що викликає useDebouncedValue, отримує свій незалежний стан. Для спільного стану потрібен контекст чи стор.
Ознаки, що варто виділити хук:
- той самий набір
useState+useEffectповторюється в кількох компонентах; - ефект синхронізується з чимось зовнішнім (
useOnlineStatus,useMediaQuery,useWebSocket) - хук ховає деталі за зрозумілою назвою; - компонент став довгим, і логіка заважає читати розмітку.
Чого уникати:
- Хуків-обгорток життєвого циклу (
useMount,useUpdateEffect): вони ховають залежності від лінтера й заохочують мислення класовими компонентами. - Хуків, що лише групують
useStateбез поведінки - виграшу немає. - Нестабільних результатів: функції, які хук повертає й які передаватимуть у залежності ефектів, обгортають у
useCallback, інакше ефекти споживачів перезапускатимуться на кожен рендер.
Тестують хуки через renderHook з React Testing Library.
Докладніше в документації: Перевикористання логіки через власні хуки