Этот вопрос проверяет понимание рекурсивных компонентов в React и методов оптимизации рендеринга для сложных древовидных структур.
Аккордеон с бесконечной вложенностью реализуется через рекурсивный компонент, который отрисовывает себя для каждого уровня вложенности. Для оптимизации используется мемоизация (React.memo), чтобы избежать лишних перерисовок, и ленивая загрузка контента.
Реализация аккордеона:
Рекурсивный компонент принимает массив данных и для каждого элемента отрисовывает заголовок и контент. Если у элемента есть вложенные элементы, компонент вызывает сам себя.
const AccordionItem = ({ item }) => {
const [isOpen, setIsOpen] = useState(false);
return (
<div>
<button onClick={() => setIsOpen(!isOpen)}>
{item.title}
</button>
{isOpen && (
<div>
<p>{item.content}</p>
{item.children?.map(child => (
<AccordionItem key={child.id} item={child} />
))}
</div>
)}
</div>
);
};Оптимизация рендеринга:
React.memo: Оберните компонент в React.memo, чтобы предотвратить перерисовку при неизменных пропсах.
useCallback: Для функций-обработчиков используйте useCallback, чтобы сохранять ссылки между рендерами.
Виртуализация: Для очень больших деревьев используйте библиотеки виртуализации (например, react-virtualized), чтобы рендерить только видимые элементы.
Ленивая загрузка: Загружайте вложенный контент только при открытии аккордеона.
Когда использовать:
Для древовидных структур данных (меню, категории, файловые системы).
Когда вложенность может быть динамической и неизвестной на этапе разработки.