MUI (Material-UI) предоставляет гибкий подход к кастомизации компонентов через систему вариантов (variants). Варианты позволяют определить несколько предустановленных стилей для одного и того же компонента, упрощая повторное использование и стандартизацию визуального оформления.
Каждый компонент в MUI поддерживает базовый набор стилей, который
можно расширять с помощью variants в теме.
Пример структуры:
import { createTheme } from '@mui/material/styles';
const theme = createTheme({
components: {
MuiButton: {
variants: [
{
props: { variant: 'dashed' },
style: {
border: '2px dashed #1976d2',
color: '#1976d2',
padding: '8px 16px',
textTransform: 'none',
},
},
{
props: { variant: 'rounded' },
style: {
borderRadius: '50px',
backgroundColor: '#f50057',
color: '#fff',
padding: '8px 24px',
},
},
],
},
},
});
Ключевые моменты:
props.variant — имя варианта, которое потом
используется в JSX.style — объект CSS-свойств, который применяется при
использовании этого варианта.После добавления вариантов в тему их можно применять в компонентах напрямую:
import { Button, ThemeProvider } from '@mui/material';
<ThemeProvider theme={theme}>
<Button variant="dashed">Dashed Button</Button>
<Button variant="rounded">Rounded Button</Button>
</ThemeProvider>
Если заданный вариант отсутствует, MUI использует стандартный вариант компонента.
Варианты в MUI работают по принципу приоритетов CSS-in-JS:
sx или
style) имеют наивысший приоритет.Пример с использованием sx:
<Button
variant="dashed"
sx={{ color: 'green', fontWeight: 'bold' }}
>
Custom Dashed
</Button>
В этом случае цвет кнопки будет зеленым, несмотря на вариант
dashed, но другие свойства из варианта сохранятся.
В MUI варианты могут включать адаптивные свойства, что делает их мощным инструментом для responsive-дизайна:
variants: [
{
props: { variant: 'responsive' },
style: {
padding: { xs: '4px 8px', sm: '8px 16px', md: '12px 24px' },
fontSize: { xs: '12px', sm: '14px', md: '16px' },
},
},
]
Использование адаптивных вариантов позволяет задавать разные размеры и отступы для разных экранов без дублирования кода.
Через функцию style можно использовать тему и
пропсы для создания динамических вариантов:
variants: [
{
props: { variant: 'dynamic' },
style: ({ theme, ownerState }) => ({
backgroundColor: ownerState.color || theme.palette.primary.main,
color: theme.palette.getContrastText(ownerState.color || theme.palette.primary.main),
padding: ownerState.large ? '12px 24px' : '6px 12px',
}),
},
]
ownerState — объект с текущими пропсами
компонента.MUI позволяет определять варианты не только для встроенных
компонентов, но и для собственных, созданных с помощью
styled или Box:
import { styled } from '@mui/material/styles';
const Card = styled('div')(({ theme }) => ({
padding: theme.spacing(2),
borderRadius: theme.shape.borderRadius,
}));
Card.variants = [
{
props: { variant: 'outlined' },
style: {
border: '1px solid #ccc',
},
},
];
После добавления в тему или напрямую к компоненту можно использовать эти варианты в JSX так же, как у стандартных компонентов MUI.
В MUI компоненты поддерживают системные свойства
(sx) и variants) одновременно, что
обеспечивает гибкость:
<Button
variant="rounded"
sx={{
backgroundColor: 'secondary.main',
'&:hover': { backgroundColor: 'secondary.dark' },
}}
>
Rounded with Hover
</Button>
Стили из sx не удаляют свойства
варианта, а лишь перекрывают их при необходимости.
sx.sx и
variants, чтобы избежать конфликтов.В результате, система вариантов в MUI позволяет создавать однородные, повторно используемые и легко поддерживаемые компоненты, что особенно важно для крупных проектов.