Композиция компонентов в Ant Design является ключевым принципом для построения масштабируемых и поддерживаемых пользовательских интерфейсов. Она позволяет объединять готовые компоненты, расширять их функциональность и создавать сложные структуры без дублирования кода. В основе лежат привычные концепции React, такие как props, children и контекст, но Ant Design добавляет собственные подходы к организации визуальных элементов и взаимодействия.
Контейнерные компоненты в Ant Design позволяют структурировать интерфейс, управлять расположением элементов и задавать общие стили. Классические примеры включают:
import { Layout, Row, Col, Card } from 'antd';
const { Header, Content, Footer } = Layout;
function Dashboard() {
return (
<Layout>
<Header>Панель управления</Header>
<Content>
<Row gutter={[16, 16]}>
<Col span={8}>
<Card title="Статистика">Контент 1</Card>
</Col>
<Col span={8}>
<Card title="Задачи">Контент 2</Card>
</Col>
<Col span={8}>
<Card title="Сообщения">Контент 3</Card>
</Col>
</Row>
</Content>
<Footer>©2026</Footer>
</Layout>
);
}
Ключевые моменты:
Row и Col обеспечивают гибкую адаптацию
под различные размеры экранов.Card может включать actions,
cover и extra для расширенной
функциональности.Композиция компонентов требует активного использования props для управления поведением вложенных элементов. Ant Design предоставляет набор стандартных props, но их можно комбинировать и переопределять.
Пример передачи props в компонент Button внутри Card:
import { Card, Button } from 'antd';
function TaskCard({ title, onComplete }) {
return (
<Card title={title} extra={<Button type="primary" onCl ick={onComplete}>Выполнено</Button>}>
Описание задачи
</Card>
);
}
Особенности:
extra позволяет добавлять элементы управления в
заголовок Card.Ant Design поддерживает концепцию children, что позволяет создавать сложные структуры:
import { Menu, Dropdown, Button } from 'antd';
const menu = (
<Menu>
<Menu.Item key="1">Профиль</Menu.Item>
<Menu.Item key="2">Настройки</Menu.Item>
<Menu.Item key="3">Выход</Menu.Item>
</Menu>
);
function UserMenu() {
return (
<Dropdown overlay={menu}>
<Button>Меню пользователя</Button>
</Dropdown>
);
}
Пояснение:
Dropdown принимает любой JSX в качестве
overlay.Для глобального или полу-глобального состояния компонентов используется React Context совместно с Ant Design:
import { ConfigProvider, Button } from 'antd';
import { useState } from 'react';
function ThemeSwitcher() {
const [dark, setDark] = useState(false);
return (
<ConfigProvider theme={{ dark }}>
<Button onCl ick={() => setDark(!dark)}>Сменить тему</Button>
</ConfigProvider>
);
}
Преимущества:
ConfigProvider позволяет задавать тему, локализацию и
другие глобальные настройки.ConfigProvider автоматически
наследуют заданные параметры.Часто требуется объединять несколько компонентов Ant Design в один переиспользуемый блок:
import { Input, Button, Space } from 'antd';
function SearchBar({ onSearch }) {
return (
<Space>
<Input placeholder="Поиск..." />
<Button type="primary" onCl ick={onSearch}>Найти</Button>
</Space>
);
}
Особенности:
Space автоматически управляет отступами между
элементами.Ant Design позволяет строить динамические интерфейсы с использованием функций для рендеринга:
import { Table, Tag } from 'antd';
const columns = [
{
title: 'Имя',
dataIndex: 'name',
},
{
title: 'Статус',
dataIndex: 'status',
render: status => (
<Tag color={status === 'Активен' ? 'green' : 'red'}>
{status}
</Tag>
),
},
];
const data = [
{ key: '1', name: 'Иван', status: 'Активен' },
{ key: '2', name: 'Мария', status: 'Неактивен' },
];
function UserTable() {
return <Table columns={columns} dataSource={data} />;
}
Преимущества динамической композиции:
render позволяет модифицировать отображение данных на
лету.ConfigProvider для глобальных
настроек. Это позволяет унифицировать тему, локализацию и стиль
компонентов.Эффективная композиция компонентов в Ant Design превращает интерфейсы в модульные, легко масштабируемые и поддерживаемые конструкции, позволяя создавать сложные пользовательские приложения без излишнего дублирования кода и с соблюдением принципов чистой архитектуры.