Компоненты высшего порядка (Higher-Order Components, HOC) — это функции, которые принимают компонент и возвращают новый компонент с расширенной функциональностью. Основная цель HOC — повторное использование логики и разделение ответственности между слоями приложения.
HOC не изменяют исходный компонент напрямую. Вместо этого создается
новый компонент-обертка, который инкапсулирует дополнительную логику и
передает её исходному компоненту через свойства (props).
Такой подход обеспечивает чистоту компонентов и предсказуемость
поведения интерфейса.
Простейшая форма HOC выглядит так:
import { Component } from 'inferno';
function withExtraProps(WrappedComponent) {
return class extends Component {
render() {
const additionalProps = { extra: 'value' };
return <WrappedComponent {...this.props} {...additionalProps} />;
}
};
}
Здесь WrappedComponent — исходный компонент, а
возвращаемый класс оборачивает его, добавляя новое свойство
extra.
При создании HOC важно правильно работать с пропсами. Все входящие свойства должны передаваться внутрь обернутого компонента. Это достигается с помощью спред-оператора:
<WrappedComponent {...this.props} newProp="something" />
Такой подход гарантирует, что исходный компонент получает все необходимые значения, а HOC может добавлять или изменять только определенные пропсы, не ломая логику использования.
function withLogging(WrappedComponent) {
return class extends Component {
componentDidMount() {
console.log(`${WrappedComponent.name} mounted`);
}
render() {
return <WrappedComponent {...this.props} />;
}
};
}
HOC может добавлять состояние или методы для управления внутренними данными:
function withCounter(WrappedComponent) {
return class extends Component {
state = { count: 0 };
increment = () => {
this.setState({ count: this.state.count + 1 });
};
render() {
return <WrappedComponent
{...this.props}
count={this.state.count}
increment={this.increment} />;
}
};
}
function withAuth(WrappedComponent) {
return class extends Component {
render() {
const isAuthenticated = !!localStorage.getItem('token');
return isAuthenticated
? <WrappedComponent {...this.props} />
: <div>Доступ запрещен</div>;
}
};
}
Несколько HOC могут быть объединены для последовательного добавления функциональности. Для этого применяется композиция функций:
import { compose } from 'redux'; // Можно использовать любую утилиту compose
const EnhancedComponent = compose(
withLogging,
withCounter,
withAuth
)(MyComponent);
Порядок применения имеет значение: первый HOC оборачивает исходный компонент, второй оборачивает результат первого и так далее.
HOC инкапсулирует логику, создавая новый компонент. Рендер-пропсы же позволяют передавать логику через функцию внутри JSX. В Inferno оба подхода могут использоваться, но HOC чаще применяется для кросс-компонентного повторного использования и декорирования компонентов.
withFeature(MyComponent) для
удобства отладки.ref на внутренний компонент. Для этого используются
специальные методы, например forwardRef.HOC в Inferno эффективно используется для:
Использование HOC позволяет создавать масштабируемую архитектуру, где логика разделена на повторно используемые модули, а компоненты остаются чистыми и переиспользуемыми.