Хуки в React
Что такое “хуки” (hooks) в React и для чего они используются?
Хуки (
Hooks
) — это функции, которые позволяют использовать состояние и
другие возможности React в функциональных компонентах.
Основные хуки:
-
useState:-
Управляет состоянием в функциональных компонентах.
-
Пример:
const [count, setCount] = useState(0);
-
-
useEffect:-
Выполняет побочные эффекты, такие как загрузка данных, в функциональных компонентах.
-
Пример:
useEffect(() => { // Выполнение побочного эффекта }, []);
-
-
useContext:-
Использует контекст для доступа к глобальным данным.
-
Пример:
const value = useContext(MyContext);
-
-
useReducer:-
Управляет сложным состоянием с помощью редюсеров.
-
Пример:
const [state, dispatch] = useReducer(reducer, initialState);
-
-
useMemo:-
Мемоизирует вычисленные значения для оптимизации производительности.
-
Пример:
const memoizedValue = useMemo(() => computeExpensiveValue(a, b), [a, b]);
-
-
useCallback:-
Мемоизирует функции для оптимизации производительности.
-
Пример:
const memoizedCallback = useCallback(() => { doSomething(a, b); }, [a, b]);
-
Хуки в React позволяют функциональным компонентам использовать состояние и другие возможности, упрощая управление состоянием, побочными эффектами и контекстом в приложениях.
Как создать собственный хук в React?
Собственный хук (custom hook) позволяет абстрагировать и повторно использовать логику состояния и эффектов в функциональных компонентах.
Шаги:
-
Создайте функцию, название которой начинается с
use:- Собственные хуки должны следовать соглашению об именовании, начинаясь с
use.
- Собственные хуки должны следовать соглашению об именовании, начинаясь с
-
Используйте внутри функции стандартные хуки React (
useState,useEffect, и т.д.):- Собственный хук может использовать любые стандартные хуки React.
-
Возвращайте необходимые значения или функции из собственного хука:
- Возвращайте данные и функции, которые должны быть доступны в компоненте.
Пример:
import { useState, useEffect } from "react";
// Создание собственного хука для получения данных
const useFetchData = (url) => {
const [data, setData] = useState(null);
const [loading, setLoading] = useState(true);
const [error, setError] = useState(null);
useEffect(() => {
const fetchData = async () => {
try {
const response = await fetch(url);
const result = await response.json();
setData(result);
setLoading(false);
} catch (err) {
setError(err);
setLoading(false);
}
};
fetchData();
}, [url]);
return { data, loading, error };
};
export default useFetchData;
Использование собственного хука в компоненте:
import React from "react";
import useFetchData from "./useFetchData";
const MyComponent = () => {
const { data, loading, error } = useFetchData("https://api.example.com/data");
if (loading) return <div>Loading...</div>;
if (error) return <div>Error: {error.message}</div>;
return <div>{JSON.stringify(data)}</div>;
};
export default MyComponent;
Создание собственного хука в React позволяет абстрагировать повторяющуюся логику и легко использовать её в различных компонентах, улучшая структуру и повторное использование кода.
Какие особенности имеют хуки useEffect и useLayoutEffect?
useEffect и useLayoutEffect — это хуки в React,
которые используются для выполнения побочных эффектов в функциональных
компонентах, но они выполняются в разное время.
useEffect:
-
Выполнение после рендеринга:
-
Выполняется после commit. Обычно браузер успевает нарисовать экран до эффекта, но эффект, вызванный взаимодействием пользователя, может выполниться до отрисовки.
-
Подходит для операций, не влияющих на отображение, таких как данные, запросы и подписки.
-
-
Использование:
useEffect(() => { // Побочные эффекты, например, загрузка данных return () => { // Очистка при размонтировании }; }, [dependencies]); // Зависимости
useLayoutEffect:
-
Выполнение перед отрисовкой браузером:
-
Выполняется после обновления DOM, но до отрисовки экрана браузером. Эффект и обновления состояния внутри него блокируют эту отрисовку.
-
Подходит для операций, влияющих на макет и измерения, таких как анимации и манипуляции с DOM.
-
-
Использование:
useLayoutEffect(() => { // Побочные эффекты, например, измерения DOM return () => { // Очистка при размонтировании }; }, [dependencies]); // Зависимости
-
useEffect: Выполняется после рендеринга, подходит для асинхронных операций и побочных эффектов, не влияющих на макет. -
useLayoutEffect: выполняется после commit, до отрисовки браузером; подходит для измерения DOM перед показом результата.
Как обрабатывать ошибки при использовании хуков (hooks) в React?
Для обработки ошибок при использовании хуков в React применяйте блоки try...catch внутри хуков или создавайте пользовательские хуки с встроенной обработкой ошибок.
Пример в useEffect:
import React, { useState, useEffect } from "react";
const MyComponent = () => {
const [data, setData] = useState(null);
const [error, setError] = useState(null);
useEffect(() => {
const fetchData = async () => {
try {
const response = await fetch("https://api.example.com/data");
if (!response.ok) throw new Error("Network response was not ok");
const result = await response.json();
setData(result);
} catch (err) {
setError(err.message);
}
};
fetchData();
}, []);
if (error) return <div>Error: {error}</div>;
if (!data) return <div>Loading...</div>;
return <div>{JSON.stringify(data)}</div>;
};
export default MyComponent;
Пример с пользовательским хуком:
import { useState, useEffect } from "react";
const useFetch = (url) => {
const [data, setData] = useState(null);
const [error, setError] = useState(null);
useEffect(() => {
const fetchData = async () => {
try {
const response = await fetch(url);
if (!response.ok) throw new Error("Network response was not ok");
const result = await response.json();
setData(result);
} catch (err) {
setError(err.message);
}
};
fetchData();
}, [url]);
return { data, error };
};
export default useFetch;
Использование пользовательского хука:
import React from "react";
import useFetch from "./useFetch";
const MyComponent = () => {
const { data, error } = useFetch("https://api.example.com/data");
if (error) return <div>Error: {error}</div>;
if (!data) return <div>Loading...</div>;
return <div>{JSON.stringify(data)}</div>;
};
export default MyComponent;
Для обработки ошибок в хуках используйте блоки try...catch внутри хуков или создавайте пользовательские хуки с встроенной обработкой ошибок для повторного использования.