Библиотека Ant Design предоставляет широкие
возможности для кастомизации компонентов через переопределение их
рендеров. Это позволяет изменять внешний вид и поведение компонентов,
сохраняя при этом их встроенную функциональность. Основным инструментом
для этого является свойство render и связанные API, такие
как renderItem, renderFormItem,
renderText и cellRender в компонентах таблиц и
списков.
Компонент Table в Ant Design позволяет задавать
кастомный рендер для каждой колонки через свойство render
объекта колонки:
import { Table, Tag } from 'antd';
const columns = [
{
title: 'Имя',
dataIndex: 'name',
key: 'name',
render: (text, record) => <b>{text}</b>
},
{
title: 'Статус',
dataIndex: 'status',
key: 'status',
render: status => {
const color = status === 'Активен' ? 'green' : 'volcano';
return <Tag color={color}>{status}</Tag>;
}
}
];
const data = [
{ key: 1, name: 'Иван', status: 'Активен' },
{ key: 2, name: 'Мария', status: 'Неактивен' }
];
<Table columns={columns} dataSource={data} />
dataIndex.В компоненте Form для полей можно использовать
свойство renderFormItem, чтобы переопределить стандартный
рендер. Особенно актуально это при работе с динамическими формами или
сложными компонентами вроде селекторов с асинхронной загрузкой
данных:
import { Form, Input, Sel ect } from 'antd';
const { Option } = Select;
<Form>
<Form.Item
label="Имя пользователя"
name="username"
renderFormItem={(item, config, form) => (
<Input placeholder="Введите имя" style={{ borderColor: 'blue' }} />
)}
/>
<Form.Item
label="Роль"
name="role"
renderFormItem={(item) => (
<Select>
<Option value="admin">Администратор</Option>
<Option value="user">Пользователь</Option>
</Select>
)}
/>
</Form>
renderFormItem принимает стандартные параметры поля,
конфигурацию и объект формы для управления значениями.Компоненты List и Card также
поддерживают кастомные рендеры через renderItem и
actions.
import { List, Avatar, Button } fr om 'antd';
const data = [
{ title: 'Документ 1', author: 'Иван' },
{ title: 'Документ 2', author: 'Мария' }
];
<List
itemLayout="horizontal"
dataSource={data}
renderItem={item => (
<List.Item
actions={[<Button type="link">Редактировать</Button>]}
>
<List.Item.Meta
avatar={<Avatar>{item.author[0]}</Avatar>}
title={<a href="#">{item.title}</a>}
description={`Автор: ${item.author}`}
/>
</List.Item>
)}
/>
renderItem позволяет полностью контролировать структуру
каждого элемента списка.cellRender в Pro ComponentsВ расширенных компонентах вроде ProTable для
рендеринга отдельных ячеек применяют свойство render или
renderText.
import { ProTable } from '@ant-design/pro-components';
const columns = [
{
title: 'Имя',
dataIndex: 'name',
render: (_, record) => <span style={{ color: 'purple' }}>{record.name}</span>
},
{
title: 'Дата регистрации',
dataIndex: 'createdAt',
renderText: (text) => new Date(text).toLocaleDateString()
}
];
renderText подходит, когда нужно преобразовать текст
без сложного JSX.render предоставляет полный контроль, включая вложенные
компоненты, кнопки, иконки и т. д.Tag, Badge, Tooltip) — сохраняет
единый стиль интерфейса.record и
dataIndex для получения полного контекста при
рендеринге.Переопределение рендеров — ключевой инструмент Ant Design для построения сложных интерфейсов с кастомной визуализацией данных и расширенной интерактивностью. Оно позволяет интегрировать внешние компоненты, стилизованные блоки и бизнес-логику, не ломая внутренние механизмы библиотеки.