Компонент Collapse из библиотеки
MUI предназначен для создания анимации сворачивания и
разворачивания контента. Он управляет видимостью дочерних элементов,
плавно изменяя их высоту. Основное свойство компонента —
in, которое принимает булево значение и определяет, открыт
или закрыт блок.
Пример базового использования:
import React, { useState } from 'react';
import { Collapse, Button, Box } from '@mui/material';
function SimpleCollapse() {
const [open, setOpen] = useState(false);
return (
<Box>
<Button onCl ick={() => setOpen(!open)}>
{open ? 'Скрыть' : 'Показать'}
</Button>
<Collapse in={open}>
<Box sx={{ padding: 2, bgcolor: 'grey.200' }}>
Содержимое, которое раскрывается
</Box>
</Collapse>
</Box>
);
}
Ключевые моменты:
in управляет состоянием раскрытия.Collapse сохраняет своё состояние
при сворачивании.'auto',
'enter', 'exit'. 'auto' вычисляет
длительность в зависимости от высоты содержимого.'vertical' (по умолчанию) или 'horizontal'.
Позволяет анимировать раскрытие по горизонтали.Пример использования collapsedSize:
<Collapse in={open} collapsedSize={40}>
<Box sx={{ bgcolor: 'lightblue', padding: 1 }}>
Контент частично виден при свернутом состоянии
</Box>
</Collapse>
По умолчанию анимация происходит вертикально, но с помощью свойства
orientation можно переключить её на горизонтальную. Это
полезно для боковых панелей или меню.
<Collapse in={open} orientation="horizontal">
<Box sx={{ width: 200, bgcolor: 'secondary.main', padding: 1 }}>
Горизонтальное раскрытие
</Box>
</Collapse>
Особенности:
width) содержимого.Collapse часто используется совместно с List, Accordion, Card и другими компонентами для создания интерактивных интерфейсов.
Пример раскрывающегося списка:
import { List, ListItem, ListItemText } from '@mui/material';
function CollapsibleList() {
const [open, setOpen] = useState(false);
return (
<List>
<ListItem button onCl ick={() => setOpen(!open)}>
<ListItemText primary="Раздел 1" />
</ListItem>
<Collapse in={open} timeout="auto" unmountOnExit>
<List component="div" disablePadding>
<ListItem sx={{ pl: 4 }}>
<ListItemText primary="Подраздел 1.1" />
</ListItem>
<ListItem sx={{ pl: 4 }}>
<ListItemText primary="Подраздел 1.2" />
</ListItem>
</List>
</Collapse>
</List>
);
}
Особенности:
unmountOnExit удаляет содержимое из DOM при
сворачивании, что может уменьшить нагрузку на страницу.timeout="auto" позволяет автоматически подбирать
скорость анимации.При использовании большого количества компонентов Collapse стоит учитывать несколько моментов:
React.memo или useMemo, чтобы избежать
лишних ререндеров.Пример с ленивой загрузкой:
<Collapse in={open} unmountOnExit>
{open && <HeavyContent />}
</Collapse>
MUI позволяет изменять параметры анимации через timeout
и easing:
<Collapse
in={open}
timeout={500}
sx={{
transition: theme => theme.transitions.create('height', {
duration: 500,
easing: theme.transitions.easing.easeInOut,
}),
}}
>
<Box sx={{ padding: 2, bgcolor: 'success.light' }}>
Анимированный контент
</Box>
</Collapse>
Рекомендации:
Grow или Fade.Popover или Tooltip для раскрывающихся
пояснений.in
должно быть привязано к управляемому состоянию, чтобы компоненты
оставались предсказуемыми.sx и
встроенные темы для соблюдения дизайна и единообразия интерфейса.Эффективное применение Collapse позволяет создавать динамичные, отзывчивые интерфейсы с минимальными усилиями и плавной анимацией.