Higher-order components (HOC) — это функция, которая принимает компонент React и возвращает новый компонент с расширенной функциональностью. В контексте MUI HOC часто используются для добавления стилей, темизации или интеграции с системами управления состоянием без изменения исходного компонента.
Композиция через функции HOC реализуются как функции, которые оборачивают исходный компонент. Это позволяет добавлять дополнительные пропсы, обрабатывать события или интегрировать сторонние библиотеки, сохраняя чистоту оригинального компонента.
const withExtraProp = (Component) => (props) => {
return <Component {...props} extra="value" />;
};Повторное использование логики HOC идеально подходят для повторного использования общей логики между компонентами. Например, обёртка для управления состоянием видимости модальных окон или добавления обработчиков событий.
Не изменяют оригинальный компонент HOC создаёт новый компонент, оставляя исходный нетронутым, что соответствует принципу иммутабельности в React.
В MUI v4 и v5 стилизация через HOC чаще всего
реализуется с помощью функций withStyles и
withTheme.
withStyleswithStyles позволяет определить CSS-in-JS стили и
применить их к компоненту:
import { withStyles, Button } from '@mui/material';
const styles = {
root: {
backgroundColor: 'blue',
color: 'white',
'&:hover': {
backgroundColor: 'darkblue',
},
},
};
const StyledButton = withStyles(styles)(Button);
export default function App() {
return <StyledButton>Нажми меня</StyledButton>;
}
Ключевые моменты:
styles — объект с ключами, соответствующими частям
компонента (root, label, icon и
т.д.).classes в исходный компонент.theme => ({}).withThemewithTheme оборачивает компонент и передает ему текущую
тему из контекста ThemeProvider:
import { withTheme } from '@mui/styles';
function ThemedComponent({ theme }) {
return <div style={{ backgroundColor: theme.palette.primary.main }}>Тема работает</div>;
}
export default withTheme(ThemedComponent);
Применение HOC с темой:
useTheme.HOC можно создавать для любых задач, например, для логирования пропсов, проверки прав доступа или управления состоянием:
const withLogger = (Component) => {
return (props) => {
console.log('Пропсы компонента:', props);
return <Component {...props} />;
};
};
const LoggedButton = withLogger(Button);
export default function App() {
return <LoggedButton variant="contained">Логирование</LoggedButton>;
}
Особенности пользовательских HOC:
withSomething(Component).Использовать HOC для классовых компонентов В
функциональных компонентах большинство задач решаются хуками
(useTheme, useStyles), но для классовых
компонентов HOC остаются актуальными.
Комбинировать с системами темизации HOC позволяют внедрять тему в компоненты, не меняя их структуру и избегая дублирования кода.
Избегать глубокого вложения HOC Слишком много
обёрток затрудняют отладку и могут влиять на производительность.
Предпочтительнее комбинировать стили через объект sx или
хуки, когда это возможно.
HOC в MUI остаются мощным инструментом для интеграции стилей и темы в
классовые компоненты, но для новых проектов рекомендуется отдавать
предпочтение хукам и sx пропсу, сочетая их с минимальным
количеством HOC для чистоты архитектуры.
withAuth для защиты страниц, где компонент
получает доступ к состоянию аутентификации.withErrorBoundary для оборачивания компонентов в
обработчик ошибок, совместимый с MUI Layout.withResponsive для адаптивной стилизации через тему и
breakpoints MUI.HOC предоставляют мощный способ повторного использования логики и стилизации, сохраняя компонент чистым и легко расширяемым, что особенно важно при работе с большим набором компонентов MUI.