MUI предоставляет встроенную библиотеку иконок
(@mui/icons-material), но часто возникает необходимость
использовать сторонние иконки, например, из Font Awesome, Material
Design Icons, Feather или других библиотек SVG- и React-компонентов. MUI
позволяет интегрировать такие иконки в компоненты без потери
стилистической целостности интерфейса.
Наиболее удобный способ использования внешних иконок — установка соответствующего пакета через npm или yarn. Например, для Font Awesome:
npm install @fortawesome/react-fontawesome @fortawesome/free-solid-svg-icons
Или для Feather Icons:
npm install react-feather
После установки иконки импортируются как React-компоненты и могут использоваться в JSX:
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
import { faCoffee } from '@fortawesome/free-solid-svg-icons';
function Example() {
return <FontAwesomeIcon icon={faCoffee} size="2x" />;
}
import { Coffee } from 'react-feather';
function Example() {
return <Coffee size={24} color="blue" />;
}
SvgIconMUI предоставляет компонент SvgIcon, который позволяет
использовать произвольные SVG-файлы в стиле MUI, сохраняя возможности
настройки цвета, размера и взаимодействия с темой. Для этого необходимо
обернуть содержимое SVG в компонент SvgIcon.
import SvgIcon from '@mui/material/SvgIcon';
function CustomIcon(props) {
return (
<SvgIcon {...props}>
<path d="M10 20v-6h4v6h5v-8h3L12 3 2 12h3v8z" />
</SvgIcon>
);
}
После этого CustomIcon можно использовать как любую
иконку MUI:
<CustomIcon color="primary" fontSize="large" />
Ключевые возможности через SvgIcon:
color (primary,
secondary, action, disabled,
error, inherit).fontSize (small,
medium, large, inherit).sx и обычные CSS-классы.Для использования иконок из сторонних коллекций SVG необходимо привести их к структуре, совместимой с React. Основные шаги:
width,
height, fill, stroke,
xmlns) для совместимости с SvgIcon.<svg> на <path> или
<g> внутри компонента SvgIcon.Пример преобразования иконки Material Design в компонент MUI:
Исходный SVG:
<svg xmlns="http://www.w3.org/2000/svg" height="24" width="24" viewBox="0 0 24 24">
<path d="M12 2L2 22h20L12 2z"/>
</svg>
Компонент MUI:
import SvgIcon from '@mui/material/SvgIcon';
function TriangleIcon(props) {
return (
<SvgIcon {...props}>
<path d="M12 2L2 22h20L12 2z" />
</SvgIcon>
);
}
Сторонние иконки можно стилизовать в стиле MUI через систему
sx:
<TriangleIcon sx={{ color: 'secondary.main', fontSize: 40 }} />
Также возможно использование темы для динамического изменения цвета и размера:
import { useTheme } from '@mui/material/styles';
function ThemedIcon() {
const theme = useTheme();
return <TriangleIcon sx={{ color: theme.palette.error.main }} />;
}
Иконки из внешних библиотек интегрируются в компоненты MUI точно так же, как встроенные:
import Button from '@mui/material/Button';
import { Coffee } from 'react-feather';
<Button variant="contained" startIcon={<Coffee />}>
Кофе
</Button>
Особенности:
startIcon и endIcon поддерживают любые
React-компоненты.sx.svgo)
перед интеграцией для уменьшения размера пакета.SvgIcon обеспечивает единый API и
поддержку темы MUI, даже если иконки берутся из сторонних
источников.IconButton, Button) для сохранения
доступности и правильного взаимодействия с клавиатурой.Этот подход позволяет гибко комбинировать внутренние и внешние иконки, сохранять единый стиль интерфейса и использовать возможности темы MUI без ограничений.