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

Что такое компонент высшего порядка?

1.6 Junior🔥 201 комментариев
#React#Архитектура и паттерны

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое компонент высшего порядка?

Higher-Order Component (HOC) — это продвинутый паттерн в React для повторного использования логики компонентов. HOC — это функция, которая берёт компонент и возвращает новый улучшенный компонент с дополнительной функциональностью.

Основной концепт

const EnhancedComponent = higherOrderComponent(OriginalComponent);

HOC — это паттерн, а не feature React. Это функция высшего порядка (принимает функцию и возвращает функцию).

Практические примеры

Пример 1: HOC для добавления свойств

const withAuth = (Component) => {
  return (props) => {
    const [isAuth, setIsAuth] = React.useState(false);
    
    React.useEffect(() => {
      checkAuth().then(auth => setIsAuth(auth));
    }, []);
    
    if (!isAuth) return <div>Требуется вход</div>;
    
    return <Component {...props} isAuth={isAuth} />;
  };
};

const ProtectedPage = withAuth(MyPage);
<ProtectedPage />

Пример 2: HOC для подписки на данные

const withData = (url) => (Component) => {
  return (props) => {
    const [data, setData] = React.useState(null);
    const [loading, setLoading] = React.useState(true);
    const [error, setError] = React.useState(null);
    
    React.useEffect(() => {
      fetch(url)
        .then(res => res.json())
        .then(data => {
          setData(data);
          setLoading(false);
        })
        .catch(err => {
          setError(err);
          setLoading(false);
        });
    }, [url]);
    
    return (
      <Component data={data} loading={loading} error={error} {...props} />
    );
  };
};

const UserList = withData('/api/users')(UserListComponent);

Пример 3: HOC для theme

const withTheme = (Component) => {
  return (props) => {
    const [theme, setTheme] = React.useState('light');
    
    const toggleTheme = () => {
      setTheme(theme === 'light' ? 'dark' : 'light');
    };
    
    return (
      <div className={`theme-${theme}`}>
        <Component theme={theme} toggleTheme={toggleTheme} {...props} />
      </div>
    );
  };
};

HOC vs Hooks vs Render Props

Hooks (современный стандарт):

function MyComponent() {
  const [data, loading] = useData('/api/users');
  return <div>{loading ? 'Загрузка...' : data}</div>;
}

Преимущества Hooks:

  • Более читаемый код
  • Проще с TypeScript
  • Меньше вложенности компонентов
  • Лучшая производительность

Когда использовать HOC?

  • Переиспользование логики между компонентами
  • Абстрахирование состояния
  • Манипуляция props
  • Обёртывание компонентов для кросс-каттинга

Потенциальные проблемы HOC

// Проблема: новая ссылка на функцию при каждом рендере
function MyComponent() {
  const hoc = withTheme(ChildComponent); // ПЛОХО!
  return <hoc />;
}

// Правильно: определи HOC вне компонента
const HocComponent = withTheme(ChildComponent);

function MyComponent() {
  return <HocComponent />;
}

Современный подход

В современном React Hooks стали стандартом:

const MyComponent = withData('/api/users')(Component);

function MyComponent() {
  const data = useData('/api/users');
  return <Component data={data} />;
}

HOC остаются полезными для интеграции с legacy кодом и специфических сценариев, но Hooks — предпочтительный способ повторного использования логики в современном React.