Компонент Tabs в библиотеке Ant Design предназначен для организации интерфейса с несколькими вкладками, каждая из которых может содержать отдельный контент. Он позволяет создавать удобную навигацию внутри страницы без необходимости перезагрузки.
import { Tabs } from 'antd';
const { TabPane } = Tabs;
function App() {
return (
<Tabs defaultActiveKey="1">
<TabPane tab="Вкладка 1" key="1">
Контент первой вкладки
</TabPane>
<TabPane tab="Вкладка 2" key="2">
Контент второй вкладки
</TabPane>
<TabPane tab="Вкладка 3" key="3">
Контент третьей вкладки
</TabPane>
</Tabs>
);
}
defaultActiveKey — определяет вкладку,
активную при первоначальной загрузке.TabPane — отдельная вкладка с пропсами
tab (заголовок) и key (уникальный
идентификатор).Неуправляемые вкладки используют
defaultActiveKey, их состояние контролируется
внутренне.
Управляемые вкладки применяют проп
activeKey и обработчик
onChange для синхронизации с внешним
состоянием:
import { useState } from 'react';
import { Tabs } from 'antd';
const { TabPane } = Tabs;
function ControlledTabs() {
const [activeKey, setActiveKey] = useState("1");
const handleChange = (key) => {
setActiveKey(key);
};
return (
<Tabs activeKey={activeKey} onCha nge={handleChange}>
<TabPane tab="Вкладка A" key="1">Контент A</TabPane>
<TabPane tab="Вкладка B" key="2">Контент B</TabPane>
</Tabs>
);
}
Ant Design предоставляет несколько вариантов отображения вкладок:
<Tabs type="card">
<TabPane tab="Вкладка 1" key="1">Контент 1</TabPane>
<TabPane tab="Вкладка 2" key="2">Контент 2</TabPane>
</Tabs>
editable-card требует обработчиков для
добавления и удаления вкладок:
function EditableTabs() {
const [panes, setPanes] = useState([
{ title: 'Tab 1', content: 'Контент 1', key: '1' },
{ title: 'Tab 2', content: 'Контент 2', key: '2' },
]);
const [activeKey, setActiveKey] = useState(panes[0].key);
const add = () => {
const newKey = `${panes.length + 1}`;
setPanes([...panes, { title: `Tab ${newKey}`, content: `Контент ${newKey}`, key: newKey }]);
setActiveKey(newKey);
};
const remove = (targetKey) => {
const newPanes = panes.filter(p => p.key !== targetKey);
setPanes(newPanes);
if (activeKey === targetKey && newPanes.length) {
setActiveKey(newPanes[0].key);
}
};
return (
<Tabs
type="editable-card"
onE dit={(targetKey, action) => {
if (action === 'add') add();
if (action === 'remove') remove(targetKey);
}}
activeKey={activeKey}
onCha nge={setActiveKey}
>
{panes.map(pane => (
<TabPane tab={pane.title} key={pane.key}>{pane.content}</TabPane>
))}
</Tabs>
);
}
Вкладки могут располагаться не только горизонтально, но и вертикально:
<Tabs tabPosition="left">
<TabPane tab="Вкладка 1" key="1">Контент 1</TabPane>
<TabPane tab="Вкладка 2" key="2">Контент 2</TabPane>
</Tabs>
По умолчанию вкладки рендерят контент сразу. Для
оптимизации можно использовать destroyInactiveTabPane,
чтобы неактивные вкладки уничтожались и создавались заново при
переключении:
<Tabs destroyInactiveTabPane>
<TabPane tab="Вкладка 1" key="1">Контент 1</TabPane>
<TabPane tab="Вкладка 2" key="2">Контент 2</TabPane>
</Tabs>
editable-card.<Tabs onCha nge={(key) => console.log('Переключено на', key)}>
<TabPane tab="Вкладка 1" key="1">Контент 1</TabPane>
<TabPane tab="Вкладка 2" key="2">Контент 2</TabPane>
</Tabs>
Вкладки легко настраиваются через CSS и встроенные пропсы:
<Tabs
tabBarExtraContent={<button>Кнопка</button>}
tabBarStyle={{ backgroundColor: '#f0f2f5' }}
animated={false}
>
<TabPane tab="Вкладка 1" key="1">Контент 1</TabPane>
</Tabs>
Вкладки можно вкладывать друг в друга, создавая сложные интерфейсы:
<Tabs defaultActiveKey="1">
<TabPane tab="Внешняя 1" key="1">
<Tabs defaultActiveKey="1-1">
<TabPane tab="Внутренняя A" key="1-1">Контент A</TabPane>
<TabPane tab="Внутренняя B" key="1-2">Контент B</TabPane>
</Tabs>
</TabPane>
<TabPane tab="Внешняя 2" key="2">Контент 2</TabPane>
</Tabs>
Использование вложенных вкладок позволяет создавать интерфейсы с несколькими уровнями навигации без перегрузки страницы.
Компонент Tabs Ant Design предоставляет:
Его гибкость позволяет строить как простые вкладочные интерфейсы, так и сложные, динамически изменяемые панели.