Ant Design предоставляет гибкую систему компонентов для построения
интерфейсов, но часто возникает необходимость использовать собственные
иконки в формате SVG, которые не входят в стандартный набор
@ant-design/icons. Для интеграции кастомных SVG можно
использовать несколько подходов, сохраняя при этом консистентность с
остальными компонентами библиотеки.
Современные сборщики, такие как Webpack или Vite, позволяют импортировать SVG напрямую как React-компоненты:
import { ReactComponent as MyIcon } from './icons/my-icon.svg';
import { Button } from 'antd';
function App() {
return (
<Button icon={<MyIcon />}>
Кнопка с кастомной иконкой
</Button>
);
}
Особенности метода:
className, style, width,
height.icon.fill,
stroke).Icon с кастомным SVGAnt Design предоставляет компонент Icon, который можно
расширять для работы с кастомными SVG через
createFromIconfontCN или напрямую:
import { Icon } from 'antd';
import { ReactComponent as CustomSvg } from './icons/custom.svg';
const CustomIcon = (props) => <Icon component={CustomSvg} {...props} />;
function App() {
return <CustomIcon style={{ fontSize: 24, color: '#1890ff' }} />;
}
Преимущества:
Icon (style,
className, spin).Кастомные SVG легко подстраиваются под стили Ant Design через CSS или inline-стили. Основные подходы:
fill:<CustomIcon style={{ fill: '#52c41a', fontSize: 32 }} />
.my-svg-icon {
width: 40px;
height: 40px;
fill: #faad14;
}
<CustomIcon className="my-svg-icon" />
transform или
stroke-dasharray:<CustomIcon style={{ animation: 'spin 2s linear infinite' }} />
@keyframes spin {
100% { transform: rotate(360deg); }
}
Кастомные SVG можно использовать практически во всех компонентах, где
поддерживается icon:
<Button icon={<CustomIcon />}>Действие</Button>
<Menu>
<Menu.Item icon={<CustomIcon />}>Пункт меню</Menu.Item>
</Menu>
<Input prefix={<CustomIcon />} placeholder="Введите текст" />
<Tabs>
<Tabs.TabPane tab={<span><CustomIcon />Вкладка 1</span>} key="1" />
</Tabs>
Для больших проектов удобно хранить набор SVG в отдельной папке и динамически импортировать их через контекст Webpack или Vite:
const svgContext = require.context('./icons', false, /\.svg$/);
function getIcon(name) {
const SvgComponent = svgContext(`./${name}.svg`).ReactComponent;
return <SvgComponent />;
}
<Button icon={getIcon('custom')}>Кнопка</Button>
Преимущества:
SVG по своей природе масштабируемы, но для интеграции с Ant Design важно учитывать:
fontSize в стилях управляет размером, если
используется компонент Icon.width и
height напрямую.viewBox и управлять размерами через CSS.Для крупных проектов удобно создать отдельный модуль с набором кастомных SVG иконок, чтобы использовать их единообразно во всех компонентах:
// icons/index.js
import { ReactComponent as SearchIcon } from './search.svg';
import { ReactComponent as UserIcon } from './user.svg';
export const Icons = {
Search: (props) => <SearchIcon {...props} />,
User: (props) => <UserIcon {...props} />,
};
Использование:
import { Icons } from './icons';
<Button icon={<Icons.Search />}>Поиск</Button>
Такой подход обеспечивает:
svgo перед импортом.Использование кастомных SVG в Ant Design позволяет создавать уникальные иконки, полностью интегрированные с экосистемой библиотеки, с полной поддержкой стилизации, анимаций и масштабируемости.