Древовидные графы представляют собой иерархические структуры, в которых каждый узел может иметь произвольное количество дочерних элементов, но только одного родителя (за исключением корневого узла). Такая модель используется в представлении файловых систем, организационных структур, классификаторов, зависимостей и множества других доменных задач.
Библиотека Nivo предоставляет компонент
Tree, предназначенный для визуализации подобных структур с
высокой степенью настраиваемости и поддержкой интерактивности.
Компонент Tree ожидает строго иерархическую структуру
данных. Основной формат — рекурсивный объект:
const data = {
id: "root",
children: [
{
id: "node-a",
children: [
{ id: "node-a1" },
{ id: "node-a2" }
]
},
{
id: "node-b",
children: [
{
id: "node-b1",
children: [
{ id: "node-b1-1" }
]
}
]
}
]
};
Ключевые требования к структуре:
id — уникальный идентификатор узлаchildren — массив дочерних узлов (может отсутствовать у
листьев)Базовый пакет для работы с деревьями входит в экосистему Nivo:
npm install @nivo/tree
Компонент используется в React-приложениях:
import { ResponsiveTree } from '@nivo/tree';
Часто применяется именно ResponsiveTree, поскольку он
автоматически адаптируется к размерам контейнера.
Минимальная реализация визуализации дерева:
import { ResponsiveTree } from '@nivo/tree';
const MyTree = ({ data }) => (
<ResponsiveTree
data={data}
identity="id"
activeNodeSize={12}
inactiveNodeSize={8}
nodeColor={{ scheme: 'category10' }}
/>
);
Основные параметры:
data — входная иерархияidentity — поле уникального идентификатораnodeColor — схема окраски узловactiveNodeSize / inactiveNodeSize —
размеры узлов при взаимодействииКомпонент поддерживает несколько стратегий расположения узлов.
Классический вариант дерева:
<ResponsiveTree
data={data}
layout="dendrogram"
orientation="vertical"
/>
Узлы располагаются по окружности, что удобно для компактного отображения больших деревьев:
<ResponsiveTree
data={data}
layout="radial"
/>
Особенности:
Поддерживаются основные направления:
verticalhorizontalГоризонтальная ориентация часто используется для файловых структур и меню:
orientation="horizontal"
Каждый узел в Nivo Tree является интерактивным объектом.
nodeSize={12}
nodeBorderWidth={1}
nodeBorderColor={{ from: 'color', modifiers: [['darker', 0.3]] }}
Ключевые аспекты:
Возможна полная замена рендера узла:
nodeComponent={({ node }) => (
<g transform={`translate(${node.x},${node.y})`}>
<circle r={8} fill={node.color} />
<text x={12} y={4}>
{node.data.id}
</text>
</g>
)}
Это позволяет:
Линии между узлами формируют структуру дерева.
linkColor={{ from: 'target.color' }}
linkThickness={2}
Nivo поддерживает различные стили соединений:
Кривые улучшают визуальное восприятие больших деревьев, уменьшая визуальный шум.
Компонент Tree активно использует взаимодействие пользователя.
Пример обработчика:
onNodeCl ick={(node) => {
console.log('Выбран узел:', node.id);
}}
Поддерживается динамическое управление видимостью ветвей:
const [data, setData] = useState(initialData);
const toggleNode = (node) => {
node.data.children = node.data.children ? undefined : node.data._children;
setData({ ...data });
};
Такой подход позволяет реализовать:
При больших деревьях важна навигация.
zoom={1}
zoomOnScroll={true}
enablePanning={true}
Эти параметры позволяют:
Nivo Tree использует декларативную модель стилизации.
nodeColor={{ scheme: 'paired' }}
Популярные схемы:
nivocategory10pairedset3Для повышения читаемости:
nodeBorderColor={{ from: 'color', modifiers: [['darker', 1.2]] }}
linkOpacity={0.6}
Такие настройки позволяют:
При работе с глубокими структурами важны оптимизации.
Пример стабилизации данных:
const memoizedData = useMemo(() => transformData(rawData), [rawData]);
Дерево может формироваться на основе API:
useEffect(() => {
fetch('/api/tree')
.then(res => res.json())
.then(setData);
}, []);
Это применяется в:
Для сложных интерфейсов дерево становится управляемым компонентом.
const [expandedNodes, setExpandedNodes] = useState([]);
Подходы:
Tree часто используется совместно с:
В отличие от них, Tree сохраняет строгую иерархию без перекрёстных связей, что делает его более детерминированным инструментом визуализации структуры данных.