Какие знаешь хуки

Ответ

React предоставляет несколько встроенных хуков:

useState - управление состоянием:

const [count, setCount] = useState(0);

useEffect - side effects:

useEffect(() => {
  document.title = `Count: ${count}`;
}, [count]);

useContext - доступ к контексту:

const theme = useContext(ThemeContext);

useReducer - сложное состояние:

const [state, dispatch] = useReducer(reducer, initialState);

useMemo/useCallback - оптимизация:

const memoizedValue = useMemo(() => computeExpensiveValue(a, b), [a, b]);
const memoizedCallback = useCallback(() => doSomething(a, b), [a, b]);

useRef - ссылки и мутируемые значения:

const inputRef = useRef(null);

useLayoutEffect - аналогичен useEffect, но срабатывает синхронно после рендера, но до отрисовки в браузере.

Также есть хуки для работы с пользовательскими хуками и хуки для Suspense (экспериментальные).

Ответ 18+ 🔞

А, ну вот, смотри, опять эти React-хуки, блядь. Как будто без них жизнь кончилась, ёпта. Ну ладно, раз уж начал, давай по полочкам разложу, а то ты опять всё перепутаешь, как в прошлый раз.

useState — это типа твоя базовая таблетка от головной боли, когда нужно просто что-то запомнить и поменять. Всё просто, как три копейки:

const [count, setCount] = useState(0);

Вот и всё, блядь. count — это твоё текущее число, а setCount — это такая волшебная пиздюлина, которая это число меняет. Вызвал setCount(5) — и всё, уже не ноль, а пять. Магия, сука.

useEffect — это уже для более хитрожопых дел. Ну, типа «сделай что-нибудь, когда что-нибудь изменится». Загрузить данные, подписаться на событие, заголовок вкладки поменять — вот это всё его епархия.

useEffect(() => {
  document.title = `Count: ${count}`;
}, [count]);

Смотри, сука, зависимость [count] — это важно. Если её забыть, он будет срабатывать на каждый чих, как идиот, и ты потом будешь гадать, почему всё лагает. А если оставить пустой массив [], то он выполнится один раз, при монтировании, и забудет, как страшный сон.

useContext — ну, это если тебе лень прокидывать пропсы через десять компонентов, как горячую картошку. Создал контекст, обернул всё в провайдера — и таскай данные откуда угодно, как из кармана.

const theme = useContext(ThemeContext);

Взял и прочитал, что там в ThemeContext лежит. Главное, чтобы провайдер выше по дереву был, а то получишь undefined и будешь чесать репу.

useReducer — это для тех случаев, когда useState уже не справляется, и состояние твое стало похоже на швейцарский сыр — дырок дохуя. Вместо прямого изменения состояния ты посылаешь «действия» (actions), а редюсер решает, как на них реагировать.

const [state, dispatch] = useReducer(reducer, initialState);

Вызвал dispatch({ type: 'INCREMENT' }) — и редюсер, этот тихий санитар, сам всё аккуратно обработает. Удобно для сложной логики, а то в setState уже мозг сломаешь.

useMemo / useCallback — это наши спасатели от лишних перерисовок, блядь. Когда компонент пересчитывается чаще, чем ты моргаешь, а тяжёлая функция внутри него каждый раз вызывается заново — вот тут они и нужны.

const memoizedValue = useMemo(() => computeExpensiveValue(a, b), [a, b]);
const memoizedCallback = useCallback(() => doSomething(a, b), [a, b]);

useMemo запоминает результат вычислений, а useCallback — саму функцию. Массивы зависимостей — святое! Не накосячь там, а то оптимизация превратится в её полную противоположность, и будет тебе пиздец, а не скорость.

useRef — это такая палочка-выручалочка. Нужно получить ссылку на DOM-элемент? Пожалуйста. Нужно хранить мутируемое значение между рендерами, которое не вызывает перерисовку? Изи.

const inputRef = useRef(null);

Просто создал реф, прицепил его к элементу через ref={inputRef} — и вот он, твой инпут, прямо в кармане. Можешь фокус ему ставить, значения читать — властвуй, блядь.

useLayoutEffect — брат-близнец useEffect, но более резкий. Он срабатывает синхронно после того, как React всё отрендерил в DOM, но до того, как браузер это всё нарисовал на экране. Нужен для измерений DOM или для действий, после которых не должно быть видимого «мигания». Используй осторожно, а то всю производительность в трубу вылетишь, ёпта.

Ну и есть ещё куча экспериментальных хуков для Suspense и прочей чертовщины, но туда лучше без бутылки не соваться, пока они официально не вышли. А то опять накосячишь, и придётся всё переделывать, в рот меня чих-пых!

Вот, вроде всё основное. Запомнил, блядь? А то опять будешь useEffect без зависимостей писать и удивляться, почему сервер API заDDOSил.