В библиотеке MUI (Material-UI) sx пропс
является одним из ключевых инструментов для стилизации компонентов. Он
предоставляет удобный способ применять стили напрямую через объект,
поддерживая синтаксис CSS-in-JS и доступ к теме. Типизация
sx пропса позволяет получить автодополнение, проверку типов
и предотвратить ошибки при передаче стилей.
sxПропс sx принимает объект, массив объектов или функцию,
возвращающую объект стилей. В TypeScript типизация выглядит следующим
образом:
import { SxProps, Theme } from '@mui/material/styles';
import Box from '@mui/material/Box';
const styles: SxProps<Theme> = {
display: 'flex',
flexDirection: 'column',
gap: 2,
};
Ключевые моменты:
SxProps<Theme> — универсальный тип, который
обеспечивает совместимость со всеми стандартными свойствами CSS и
расширениями темы MUI.Theme импортируется из
@mui/material/styles и позволяет использовать значения из
темы, например palette, spacing и
typography.sxФункция в sx получает текущую тему и возвращает объект
стилей:
<Box
sx={(theme) => ({
color: theme.palette.primary.main,
padding: theme.spacing(2),
'&:hover': {
backgroundColor: theme.palette.action.hover,
},
})}
/>
Особенности:
theme строго соответствует типу темы приложения,
что даёт автодополнение и проверку типов.sxsx поддерживает массив объектов, что позволяет
комбинировать несколько наборов стилей:
const baseStyles: SxProps<Theme> = {
display: 'flex',
alignItems: 'center',
};
const hoverStyles: SxProps<Theme> = {
'&:hover': {
backgroundColor: 'grey.100',
},
};
<Box sx={[baseStyles, hoverStyles]} />
Преимущества массива:
SxProps<Theme>.sx полностью поддерживает работу с темой MUI. Все
свойства цвета, отступов и шрифтов можно задавать через объект темы:
<Box
sx={{
color: (theme) => theme.palette.success.main,
margin: (theme) => theme.spacing(3),
typography: 'h6',
}}
/>
Важные моменты:
theme.spacing(n) гарантирует
единообразные отступы.palette позволяет использовать системные цвета
MUI (primary, secondary, error,
success, warning, info).typography позволяет применить готовые стили
заголовков и текста из темы.Для собственных компонентов, которые оборачиваются в Box
или другие MUI-компоненты, можно указать типизацию sx
следующим образом:
import { SxProps, Theme } from '@mui/material/styles';
interface CustomButtonProps {
sx?: SxProps<Theme>;
label: string;
}
const CustomButton: React.FC<CustomButtonProps> = ({ sx, label }) => (
<Box component="button" sx={sx}>
{label}
</Box>
);
Особенности:
sx остаётся опциональным.SxProps<Theme>.TypeScript позволяет безопасно комбинировать условные стили:
const isActive = true;
<Box
sx={{
backgroundColor: isActive ? 'primary.main' : 'grey.300',
padding: 2,
'&:hover': {
backgroundColor: isActive ? 'primary.dark' : 'grey.400',
},
}}
/>
Преимущества:
MUI предоставляет вспомогательные типы для более точной типизации:
SystemStyleObject<Theme> — для объектов стилей с
поддержкой темы.SxProps<Theme> — для передачи в sx,
поддерживает объекты, массивы и функции.Theme — основная тема приложения, включающая
palette, spacing, typography,
breakpoints.import { SxProps, Theme, SystemStyleObject } from '@mui/material/styles';
const styleObject: SystemStyleObject<Theme> = {
display: 'flex',
justifyContent: 'space-between',
};
const sxStyle: SxProps<Theme> = styleObject;
sxМожно расширять тему и использовать новые свойства с полной поддержкой типизации:
import { createTheme, Theme } from '@mui/material/styles';
declare module '@mui/material/styles' {
interface Theme {
custom: {
mainColor: string;
};
}
interface ThemeOptions {
custom?: {
mainColor?: string;
};
}
}
const theme = createTheme({
custom: {
mainColor: '#FF5722',
},
});
<Box
sx={(theme: Theme) => ({
color: theme.custom.mainColor,
})}
/>
Особенности:
sx.sxsx пропс является гибким и типобезопасным способом
стилизации.SxProps<Theme> и
SystemStyleObject<Theme> позволяют предотвращать
ошибки на этапе компиляции.