В библиотеке MUI (Material-UI) компонент Accordion используется для организации контента в сворачиваемые панели. В случае сложных интерфейсов часто требуется реализовать вложенные аккордеоны, когда внутри одной панели находятся другие аккордеоны, обеспечивая структурированное отображение данных.
Компонент Accordion состоит из трёх основных частей:
Простейший пример:
import Accordion from '@mui/material/Accordion';
import AccordionSummary from '@mui/material/AccordionSummary';
import AccordionDetails from '@mui/material/AccordionDetails';
import Typography from '@mui/material/Typography';
import ExpandMoreIcon from '@mui/icons-material/ExpandMore';
}
aria-controls="panel1-content"
id="panel1-header"
>
Заголовок панели
Содержимое панели
Вложенные аккордеоны создаются путем размещения одного компонента
Accordion внутри AccordionDetails другого.
Основные моменты, на которые следует обратить внимание:
aria-controls и id должны быть уникальными для
каждой вложенной панели, чтобы обеспечить корректную доступность.sx={{ ml: 2 }}
или аналогичных свойств, чтобы подчеркнуть вложенность.Пример вложенного аккордеона:
}>
Внешний аккордеон
Основное содержимое внешнего аккордеона
}>
Внутренний аккордеон 1
Содержимое внутреннего аккордеона 1
}>
Внутренний аккордеон 2
Содержимое внутреннего аккордеона 2
MUI поддерживает два подхода к управлению состоянием: неуправляемые и управляемые аккордеоны.
Неуправляемые:
AccordionSummary.expanded.Управляемые:
expanded и
onChange.Пример управляемого вложенного аккордеона:
const [expandedOuter, setExpandedOuter] = React.useState(false);
const [expandedInner, setExpandedInner] = React.useState(false);
setExpandedOuter(!expandedOuter)}>
}>
Внешний аккордеон
setExpandedInner(!expandedInner)}>
}>
Внутренний аккордеон
Содержимое внутреннего аккордеона
Панель с кастомным стилем
Вложенный аккордеон
TransitionProps:
Панель с медленным раскрытием
Вложенные аккордеоны часто комбинируют с компонентами
List и ListItem для создания сложных меню или
FAQ. Основные рекомендации:
AccordionDetails можно разместить
для упорядочивания контента.disablePadding для списков, чтобы избежать
лишних отступов.Пример:
FAQ Категория 1
Вопрос 1
Ответ на вопрос 1
Вопрос 2
Ответ на вопрос 2
При большом количестве вложенных аккордеонов:
unmountOnExit в Accordion, чтобы не держать
все детали в DOM.Пример:
Оптимизированная панель