Компоненты MUI (Material-UI) в React проектируются с учетом гибкости
и расширяемости, поэтому большинство компонентов поддерживают передачу
пропсов, позволяющих настраивать внешний вид и
поведение компонентов. Пропсы могут быть стандартными (например,
className, style) или специфичными для MUI
(например, variant, color,
size).
Пример передачи базовых пропсов:
import Button from '@mui/material/Button';
function App() {
return (
<Button variant="contained" color="primary" size="large">
Нажми меня
</Button>
);
}
Здесь variant, color и size —
это пропсы, которые компонент Button обрабатывает внутри себя и
использует для генерации стилей.
Часто возникает необходимость передать все свойства родительского элемента в дочерний компонент, не перечисляя их по одному. Для этого используется спред-оператор:
function CustomButton(props) {
return <Button {...props} />;
}
<CustomButton variant="outlined" color="secondary" onCl ick={() => console.log('Clicked')} />;
Использование {...props} позволяет дочернему компоненту
принимать любые дополнительные атрибуты, включая стандартные
HTML-атрибуты (id, title, aria-*)
и специфичные для MUI.
MUI полностью поддерживает TypeScript, что позволяет строго типизировать пропсы компонентов. Для собственных компонентов рекомендуется использовать типы из MUI:
import { Button, ButtonProps } from '@mui/material';
interface CustomButtonProps extends ButtonProps {
highlight?: boolean;
}
const CustomButton: React.FC<CustomButtonProps> = ({ highlight, ...props }) => {
return (
<Button
{...props}
style={{
backgroundColor: highlight ? 'yellow' : undefined,
...props.style
}}
/>
);
};
highlight) можно объявить
через собственный интерфейс, расширяющий базовый тип.MUI компоненты используют типизированные обработчики событий React.
Например, onClick имеет тип
(event: React.MouseEvent<HTMLButtonElement>) => void.
<Button
onCl ick={(event) => {
console.log('Кликнули!', event.currentTarget);
}}
>
Click me
</Button>
Типизация событий особенно важна при использовании TypeScript, так как позволяет IDE предоставлять автодополнение и проверку типов.
MUI предлагает несколько способов управления стилями через пропсы:
<Button sx={{ backgroundColor: 'green', padding: 2 }}>
Зеленая кнопка
</Button>
<Button className="my-button">
Кнопка с классом
</Button>
import { styled } from '@mui/material/styles';
import Button from '@mui/material/Button';
const MyButton = styled(Button)<{ highlight?: boolean }>(({ highlight }) => ({
backgroundColor: highlight ? 'orange' : 'blue',
color: '#fff',
'&:hover': {
backgroundColor: highlight ? 'darkorange' : 'darkblue',
},
}));
<MyButton highlight>Кастомная кнопка</MyButton>
Иногда необходимо, чтобы дочерний компонент получал только определённые пропсы из родителя. Для этого используют деструктуризацию:
interface CardProps {
title: string;
content: string;
onClick?: () => void;
}
const Card: React.FC<CardProps> = ({ title, content, onClick }) => {
return (
<div onCl ick={onClick} className="card">
<h3>{title}</h3>
<p>{content}</p>
</div>
);
};
<Card title="Заголовок" content="Текст карточки" onCl ick={() => alert('Clicked')} />;
MUI компоненты позволяют аналогично фильтровать пропсы для передачи их в более глубокие уровни, сохраняя совместимость с типами.
ButtonProps, TextFieldProps,
PaperProps) для всех стандартных компонентов.Omit или
Pick для выборочной модификации пропсов при
создании обёрток:interface CustomTextFieldProps extends Omit<TextFieldProps, 'variant'> {
customVariant?: 'fancy' | 'simple';
}
ref.component позволяют заменять базовый
HTML-элемент на кастомный, сохраняя типизацию всех остальных
атрибутов:<Button component="a" href="/home">
Ссылка
</Button>
{...props} используется для передачи
всех оставшихся пропсов.sx и styled позволяет
комбинировать стили MUI и кастомные стили без конфликтов типов.Такой подход к передаче пропсов и их типизации обеспечивает гибкость, безопасность и совместимость с современными стандартами React и MUI, позволяя создавать масштабируемые интерфейсы с предсказуемым поведением компонентов.