1975 просмотров
от 17 февраля 2024
React

Шпаргалка по полезным хукам для React-разработчика

Шпаргалка, включающая набор пользовательских хуков, которые могут оказаться полезными при создании интерфейсов на React.js. Склонение слов, работа с мета-тегами, управление модальными окнами, троттлинг и отложение выполнение, и многое другое.

1

Хук для взаимодействия с клавиатурой

import { useEffect } from 'react' const useKeyListener = (callback) => { useEffect(() => { const listener = (e) => { e = e || window.event const tagName = e.target.localName || e.target.tagName // Принимаем только события на уровне body, // чтобы избежать их перехвата, например, в полях ввода if (tagName.toUpperCase() === 'BODY') { callback(e) } } document.addEventListener('keydown', listener, true) return () => { document.removeEventListener('keydown', listener, true) } }, [callback]) } export default useKeyListener

Комментарии
0/3000
2

Хук для склонения слов

Хук, который в зависимости от числа подставляет необходимое склонение слова или выражения. Пример использования: const { text } = useWordDeclination(correctAnswersCount, [ "верный ответ", "верных ответа", "верных ответов", ]) Реализация (TypeScript): import { useMemo } from "react" export const useWordDeclination = ( n: number, strings: [string, string, string], ) => { const text = useMemo(() => { const words = [strings[0], strings[1], strings[2]] return words[ n % 100 > 4 && n % 100 < 20 ? 2 : [2, 0, 1, 1, 1, 2][n % 10 < 5 ? n % 10 : 5] ] }, [n, strings]) return { text } }

Комментарии
0/3000
3

Хук для изменения мета-тегов

Хук, изменяющий title и description мета-тэги для страницы при её открытии и восстанавливающий их значения при ее покидании. Пример использования: usePageMeta({ title, description }) Реализация: import { useEffect } from "react" type Props = { title: string description?: string } const DEFAULT = { title: "Заголовок страницы по умолчанию (заголовок для главной страницы)", description: "Описание по умолчанию (описание для главной страницы)", } export const usePageMeta = ({ title, description }: Props) => { useEffect(() => { document.title = title description && document .querySelector('head meta[name="description"]') ?.setAttribute("content", description) return () => { document.title = DEFAULT.title document .querySelector('head meta[name="description"]') ?.setAttribute("content", DEFAULT.description) } }, [title, description]) }

Комментарии
0/3000
4

Хук для управления модальным окном

export function useModal() { const [isOpened, setIsOpened] = useState(false); const restrictBodyScroll = () => { document.body.style.height = "100vh"; document.body.style.overflow = "hidden"; }; const allowBodyScroll = () => { document.body.style.height = ""; document.body.style.overflow = ""; }; const open = () => { setTimeout(() => { restrictBodyScroll(); }, 0); setIsOpened(true); }; const close = () => { allowBodyScroll(); setIsOpened(false); }; useEffect(() => { return close; }, []); return { isOpened, open, close, }; } setTimeout в open нужен для того, чтобы скролл body корректно запретился в том случае, если модалка открывается сразу после закрытия предыдущей. Пример использования: const SomeComponent = () => { const confirmModal = useModal(); return ( <div> <button onClick={confirmModal.open}>Открыть модальное окно</button> <SomeModalComponent isOpened={confirmModal.isOpened} close={confirmModal.close} /> </div> ); }; export default SomeComponent;

Комментарии
0/3000
5

Хук для получения размеров окна

import { useState, useEffect } from "react"; interface WindowSize { width: number; height: number; } const useWindowSize = (): WindowSize => { const [windowSize, setWindowSize] = useState<WindowSize>({ width: window.innerWidth, height: window.innerHeight, }); useEffect(() => { const handleResize = () => { setWindowSize({ width: window.innerWidth, height: window.innerHeight, }); }; window.addEventListener("resize", handleResize); return () => { window.removeEventListener("resize", handleResize); }; }, []); return windowSize; };

Комментарии
0/3000
6

Хук для setInterval

import { useState, useEffect, useRef } from "react"; const useInterval = (callback: () => void, delay: number | null) => { const savedCallback = useRef<() => void>(); useEffect(() => { savedCallback.current = callback; }, [callback]); useEffect(() => { function tick() { savedCallback.current && savedCallback.current(); } if (delay !== null && delay > 0) { let id = setInterval(tick, delay); return () => clearInterval(id); } else { tick(); } }, [delay]); };

Комментарии
0/3000
7

Хук для доступа к предыдущему значению стейта

import { useRef, useEffect } from "react"; const usePrevious = <T>(value: T): T | undefined => { const ref = useRef<T>(); useEffect(() => { ref.current = value; }); return ref.current; }; export default usePrevious; Пример использования: import React, { useState } from "react"; import usePrevious from "./usePrevious"; const Counter = () => { const [count, setCount] = useState(0); const prevCount = usePrevious(count); const handleClick = () => { setCount(count => count + 1); }; return ( <div> Current count: {count}, Previous count: {prevCount} <button onClick={handleClick}>Increment</button> </div> ); }; export default Counter;

Комментарии
0/3000
Авторизуйтесь, чтобы открыть доступ к контенту
9

Хук для троттлинга выполнения

10

Хук для отложенного выполнения

11

Хук для работы с Intersection Observer

12

Хук для получения информации о сетевом соединении

13

Хук для информации о геолокации в реальном времени

14

Хук для преобразования голоса в текст

15

Хук для продвинутых жестов на тачпадах

16

Хук для отслеживания выделения текста

17

Хук для взаимодействия между вкладками

18

Хук для работы с Cookie

19

Хук для отслеживания размеров элемента

20

Хук для работы с localStorage

21

Хук для отслеживания активности пользователя

22

Хук для отслеживания долгого нажатия

23

Хук для копирования в буффер обмена

24

Хук для динамической высоты textarea

25

Хук для работы с Web Share API

Вопросники по React
React
25 вопросов
Вопросы и ответы с собеседований по React.js
2902 просмотра
React
24 вопроса
Шпаргалка по полезным хукам для React-разработчика
1974 просмотра
Хотите заработать на создании вопросников?
Стать редактором
Смежные категории
JavaScript
58 вопросов
Вопросы и ответы с собеседований по JavaScript
5779 просмотров
TypeScript
21 вопрос
Вопросы и ответы с собеседований по TypeScript
3122 просмотра
CSS
19 вопросов
Вопросы и ответы с собеседований по CSS
1891 просмотр
Vue
15 вопросов
Вопросы и ответы с собеседований по Vue.js
1640 просмотров
Angular
74 вопроса
Вопросы и ответы с собеседований по Angular
1515 просмотров
Рекомендуем
Computer Science
28 вопросов
Объяснение паттернов проектирования с примерами
1341 просмотр
Computer Science
12 вопросов
Вопросы с собеседований про операционные системы
1017 просмотров
Computer Science
15 вопросов
Вопросы и ответы с собеседований по DDD
1445 просмотров
Базы данных
60 вопросов
Вопросы и ответы с собеседований по SQL
2193 просмотра
Computer Science
13 вопросов
Вопросы и ответы с собеседований про ООП
1133 просмотра
Computer Science
11 вопросов
Вопросы и ответы про интернет-протоколы
1359 просмотров
Другие разделы

Лента

Активность пользователей Девстанции

Перейти к ленте

Лидеры

Рейтинг самых результативных пользователей сообщества

Перейти к лидерам

Треды

Общение по интересам и связь с разработчиками

Перейти к тредам

Задачи

Решение алгоритмических задач с собеседований

Перейти к задачам

Вопросы

Ответы на вопросы с технических собеседований

Вы находитесь здесь

Викторины

Интерактивные викторины по вопросам с собеседований

Перейти к викторинам
Мы в Telegram
Новости проекта, общение с разработчиками, общение по интересам - присоединяйтесь!