Tabs и TabPanel — это ключевые компоненты библиотеки MUI для организации контента в виде вкладок. Они позволяют создавать интерфейсы с переключаемыми панелями, что особенно удобно для отображения больших объемов информации в компактной форме.
Для работы с вкладками необходимо импортировать основные элементы из MUI:
import Tabs from '@mui/material/Tabs';
import Tab from '@mui/material/Tab';
import Box from '@mui/material/Box';
Если планируется использовать кастомный компонент для панели содержимого, создается отдельный компонент TabPanel.
Компонент TabPanel отвечает за отображение содержимого вкладки. Его базовая структура включает проверку активной вкладки:
function TabPanel(props) {
const { children, value, index, ...other } = props;
return (
<div
role="tabpanel"
hidden={value !== index}
id={`tabpanel-${index}`}
aria-labelledby={`tab-${index}`}
{...other}
>
{value === index && (
<Box sx={{ p: 3 }}>
{children}
</Box>
)}
</div>
);
}
Ключевые моменты:
value — текущий индекс активной вкладки.index — индекс панели.hidden скрывает панели, которые не активны,
улучшая производительность.aria-labelledby и role="tabpanel"
обеспечивают доступность.Компонент Tabs служит контейнером для вкладок
Tab. Основной атрибут — value, который
контролирует активную вкладку.
function BasicTabs() {
const [value, setValue] = React.useState(0);
const handleChange = (event, newValue) => {
setValue(newValue);
};
return (
<Box sx={{ width: '100%' }}>
<Tabs value={value} onCha nge={handleChange} aria-label="basic tabs example">
<Tab label="Вкладка 1" />
<Tab label="Вкладка 2" />
<Tab label="Вкладка 3" />
</Tabs>
<TabPanel value={value} index={0}>
Содержимое вкладки 1
</TabPanel>
<TabPanel value={value} index={1}>
Содержимое вкладки 2
</TabPanel>
<TabPanel value={value} index={2}>
Содержимое вкладки 3
</TabPanel>
</Box>
);
}
Особенности:
useState.handleChange синхронизирует выбранную вкладку и
отображаемую панель.aria-label повышает доступность интерфейса для
скринридеров.Вкладки могут располагаться горизонтально (по умолчанию) или
вертикально. Для вертикальной ориентации используется свойство
orientation:
<Tabs
orientation="vertical"
value={value}
onCha nge={handleChange}
aria-label="Vertical tabs example"
sx={{ borderRight: 1, borderColor: 'divider' }}
>
<Tab label="Вкладка 1" />
<Tab label="Вкладка 2" />
<Tab label="Вкладка 3" />
</Tabs>
Стилизация через sx:
borderRight и borderColor создают
визуальное разделение.sx.MUI поддерживает ленивую загрузку, когда содержимое вкладки рендерится только при активации:
<TabPanel value={value} index={0} >
{value === 0 && <HeavyComponent />}
</TabPanel>
Такой подход повышает производительность при большом количестве вкладок или тяжелых компонентах.
Индикатор активной вкладки настраивается через Tabs:
<Tabs
value={value}
onCha nge={handleChange}
TabIndicatorProps={{ style: { backgroundColor: 'red', height: 4 } }}
>
<Tab label="Вкладка 1" />
<Tab label="Вкладка 2" />
</Tabs>
Возможности кастомизации:
TabIndicatorProps).selected CSS-класс.icon в
Tab.Для корректного взаимодействия с ассистивными технологиями необходимо:
aria-controls и id на вкладки и
панели.role="tabpanel" для панели и
role="tab" для вкладки.value и index
соответствовали друг другу.MUI Tabs поддерживают:
standard, scrollable,
fullWidth.Пример скроллируемых вкладок:
<Tabs
value={value}
onCha nge={handleChange}
variant="scrollable"
scrollButtons="auto"
>
{Array.from({ length: 10 }, (_, i) => (
<Tab key={i} label={`Вкладка ${i + 1}`} />
))}
</Tabs>
Такой подход полезен при создании интерфейсов с динамическим количеством вкладок.
Комбинация Tabs и TabPanel позволяет создавать гибкие интерфейсы с хорошо структурированным контентом. Возможности кастомизации, управление состоянием и доступность делают их универсальным инструментом для проектов на React с MUI.