Перейти к содержимому
шпаргалка.
Esc
навигацияоткрыть⌘Jпредпросмотр
На этой странице

Хуки в React

Все темы React Developer

Что такое “хуки” (hooks) в React и для чего они используются?

Хуки ( Hooks ) — это функции, которые позволяют использовать состояние и другие возможности React в функциональных компонентах.

Основные хуки:

  1. useState:

    • Управляет состоянием в функциональных компонентах.

    • Пример:

      const [count, setCount] = useState(0);
  2. useEffect:

    • Выполняет побочные эффекты, такие как загрузка данных, в функциональных компонентах.

    • Пример:

      useEffect(() => {
        // Выполнение побочного эффекта
      }, []);
  3. useContext:

    • Использует контекст для доступа к глобальным данным.

    • Пример:

      const value = useContext(MyContext);
  4. useReducer:

    • Управляет сложным состоянием с помощью редюсеров.

    • Пример:

      const [state, dispatch] = useReducer(reducer, initialState);
  5. useMemo:

    • Мемоизирует вычисленные значения для оптимизации производительности.

    • Пример:

      const memoizedValue = useMemo(() => computeExpensiveValue(a, b), [a, b]);
  6. useCallback:

    • Мемоизирует функции для оптимизации производительности.

    • Пример:

      const memoizedCallback = useCallback(() => {
        doSomething(a, b);
      }, [a, b]);

Хуки в React позволяют функциональным компонентам использовать состояние и другие возможности, упрощая управление состоянием, побочными эффектами и контекстом в приложениях.


Как создать собственный хук в React?

Собственный хук (custom hook) позволяет абстрагировать и повторно использовать логику состояния и эффектов в функциональных компонентах.

Шаги:

  1. Создайте функцию, название которой начинается с use:

    • Собственные хуки должны следовать соглашению об именовании, начинаясь с use.
  2. Используйте внутри функции стандартные хуки React (useState, useEffect, и т.д.):

    • Собственный хук может использовать любые стандартные хуки React.
  3. Возвращайте необходимые значения или функции из собственного хука:

    • Возвращайте данные и функции, которые должны быть доступны в компоненте.

Пример:

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:

  1. Выполнение после рендеринга:

    • Выполняется после commit. Обычно браузер успевает нарисовать экран до эффекта, но эффект, вызванный взаимодействием пользователя, может выполниться до отрисовки.

    • Подходит для операций, не влияющих на отображение, таких как данные, запросы и подписки.

  2. Использование:

    useEffect(() => {
      // Побочные эффекты, например, загрузка данных
      return () => {
        // Очистка при размонтировании
      };
    }, [dependencies]); // Зависимости

useLayoutEffect:

  1. Выполнение перед отрисовкой браузером:

    • Выполняется после обновления DOM, но до отрисовки экрана браузером. Эффект и обновления состояния внутри него блокируют эту отрисовку.

    • Подходит для операций, влияющих на макет и измерения, таких как анимации и манипуляции с DOM.

  2. Использование:

    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 внутри хуков или создавайте пользовательские хуки с встроенной обработкой ошибок для повторного использования.

Эта страница была полезной?