← Назад ко всем вопросам

Как работают useMemo и useCallback

1️⃣ Как кратко ответить

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

2️⃣ Подробное объяснение темы

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

useMemo

useMemo используется для мемоизации значений. Это значит, что он запоминает результат функции и возвращает его, если зависимости не изменились. Это полезно, когда у вас есть дорогостоящие вычисления, которые не должны выполняться при каждом рендере.

Пример использования useMemo:

import React, { useMemo } from 'react';
​
function ExpensiveComponent({ items }) {
  // Мемоизируем вычисление, чтобы оно выполнялось только при изменении items
  const total = useMemo(() => {
    console.log('Calculating total...');
    return items.reduce((sum, item) => sum + item.price, 0);
  }, [items]);
​
  return <div>Total: {total}</div>;
}
  • useMemo принимает два аргумента: функцию, которая выполняет вычисления, и массив зависимостей.
  • Если items не изменились, useMemo вернет ранее вычисленное значение total, избегая повторного выполнения функции.
  • Это особенно полезно, если items — это большой массив, и вычисление суммы занимает значительное время.

useCallback

useCallback используется для мемоизации функций. Это предотвращает создание новой функции при каждом рендере, что может быть важно, если функция передается в дочерние компоненты, которые зависят от её идентичности.

Пример использования useCallback:

import React, { useState, useCallback } from 'react';
​
function Button({ onClick }) {
  console.log('Button rendered');
  return <button onClick={onClick}>Click me</button>;
}
​
function ParentComponent() {
  const [count, setCount] = useState(0);
​
  // Мемоизируем функцию, чтобы она не пересоздавалась при каждом рендере
  const handleClick = useCallback(() => {
    setCount(prevCount => prevCount + 1);
  }, []);
​
  return (
    <div>
      <p>Count: {count}</p>
      <Button onClick={handleClick} />
    </div>
  );
}
  • useCallback принимает два аргумента: функцию и массив зависимостей.
  • Если зависимости не изменились, useCallback вернет ту же функцию, что и в предыдущем рендере.
  • Это предотвращает ненужные рендеры дочерних компонентов, таких как Button, которые зависят от функции onClick.

Зачем это нужно

  • Оптимизация производительности: Уменьшает количество вычислений и рендеров, что особенно важно в больших приложениях.
  • Стабильность ссылок: Поддерживает стабильность ссылок на функции и объекты, что важно для оптимизации рендеринга дочерних компонентов.

Где применяется

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

Использование useMemo и useCallback может значительно улучшить производительность вашего приложения, но важно использовать их осознанно, так как избыточное использование может привести к усложнению кода без значительных преимуществ.

Тема: React
Стадия: Tech

🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!

Твои заметки