В библиотеке Nivo, построенной поверх React, вся конфигурация визуализаций управляется через систему пропсов. Эта модель является ключевым механизмом настройки компонентов: она определяет, какие данные будут отображаться, как будет выглядеть график, какие элементы интерфейса активны и каким образом происходит адаптация под контейнер. Архитектура пропсов в Nivo сознательно разделена на обязательные и опциональные параметры, что позволяет одновременно сохранять строгую предсказуемость и гибкость настройки.
Обязательные пропсы — это минимальный набор входных данных, без которых компонент визуализации не может быть построен. Их отсутствие приводит либо к ошибке рендера, либо к пустому состоянию графика.
Главный обязательный пропс практически для всех визуализаций Nivo —
data.
Он определяет источник данных и его структуру. В зависимости от типа графика формат различается:
id,
value, label.Пример концептуальной структуры:
data: [
{ id: 'A', value: 12 },
{ id: 'B', value: 19 },
{ id: 'C', value: 7 }
]
Ключевой момент: Nivo не нормализует данные автоматически. Структура должна соответствовать ожидаемой схеме конкретного компонента.
В многосерийных визуализациях (stacked bar chart, grouped bar chart,
heatmap) обязательным становится пропс keys.
Он определяет, какие поля объекта данных будут использоваться как серии.
keys: ['sales', 'revenue', 'profit']
Если keys не совпадает с фактической структурой
data, визуализация будет частично или полностью
некорректной.
Важно: keys выступает как декларативный
контракт между данными и визуальным представлением.
Для категориальных графиков требуется указание поля индексации:
indexBy: 'country'
Этот пропс определяет, как группируются данные по оси X или по категориальному признаку.
Без indexBy библиотека не сможет корректно построить
шкалу категорий.
Для базовых компонентов обязательными являются width и
height, если не используется responsive-обёртка:
width: 600,
height: 400
В случае использования Responsive* компонентов эти
пропсы становятся неявно управляемыми контейнером, но концептуально
остаются обязательной частью модели рендеринга.
Суть: Nivo не работает с “автоматическим размером” без контекста — всегда требуется явная или контейнерная геометрия.
Опциональные пропсы формируют основную силу Nivo: именно они отвечают за кастомизацию, стилизацию и поведение графиков. Их отсутствие не ломает рендеринг, но влияет на внешний вид и функциональность.
margin: { top: 40, right: 40, bottom: 50, left: 60 }
Определяет внутренние отступы графика.
Если не задан, используется стандартный preset компонента.
Особенность: margin влияет не только на внешний вид, но и на область отрисовки осей и подписей.
Пропс colors управляет цветовой схемой:
colors: { scheme: 'nivo' }
или
colors: ['#ff0000', '#00ff00', '#0000ff']
Он может принимать:
Важно: Nivo применяет цвета на уровне серии, а не отдельных точек (за исключением scatter/heatmap).
Пропс theme позволяет полностью переопределить
визуальный стиль:
theme: {
axis: {
ticks: {
text: {
fill: '#999'
}
}
},
grid: {
line: {
stroke: '#eee'
}
}
}
Он влияет на:
Ключевая особенность: theme наследуется глубоко, но не полностью заменяет дефолт — происходит merge объектов.
Пропсы осей являются опциональными, но критически важными для читаемости:
axisBottom: {
tickSize: 5,
tickPadding: 5,
tickRotation: 0,
legend: 'Дата',
legendOffset: 36
}
Доступны отдельные конфигурации:
axisTopaxisBottomaxisLeftaxisRightЕсли пропс не задан, ось может отображаться в упрощённом виде или скрываться полностью.
Легенды управляются через массив конфигураций:
legends: [
{
anchor: 'bottom-right',
direction: 'column',
itemsSpacing: 2,
itemWidth: 100,
itemHeight: 20
}
]
Легенды полностью опциональны, но часто используются для многосерийных данных.
Tooltip в Nivo может быть:
tooltip: ({ id, value, color }) => (
<div style={{ color }}>
{id}: {value}
</div>
)
Особенность: tooltip не является частью DOM графика, он рендерится в отдельном overlay-слое.
Анимации управляются двумя связанными пропсами:
animate: true,
motionConfig: 'gentle'
или кастомной конфигурацией:
motionConfig: {
mass: 1,
tension: 170,
friction: 26
}
Если animate отключён, все motion-эффекты
игнорируются.
Используется в линейных графиках для группировки данных:
enableSlices: 'x'
Включает логическое разбиение области графика для tooltip и взаимодействия.
В bar chart:
enableStacking: true
Определяет, будут ли серии складываться друг на друга.
Важно: влияет на трансформацию данных перед отрисовкой.
Для line charts:
curve: 'monotoneX'
Определяет алгоритм интерполяции линий:
Этот пропс не влияет на данные, только на геометрию визуализации.
onClick: (node) => {
console.log(node)
}
Обрабатывает клики по элементам графика.
Передаваемый объект зависит от типа визуализации и содержит метаданные узла.
Позволяют реализовать кастомные hover-эффекты:
onMouseEnter: (node) => {
// выделение
}
isInteractive: true
Если отключить, график становится полностью статическим: без tooltip, без событий, без hover-эффектов.
Nivo позволяет форматировать отображаемые значения:
valueFormat: value => `${value}%`
Или с использованием библиотек форматирования чисел:
valueFormat: new Intl.NumberFormat('ru-RU').format
Особенность: форматирование применяется только к отображению, но не к исходным данным.
Некоторые компоненты Nivo используют внутреннюю модель ролей:
Эти роли определяют, как данные преобразуются в визуальные примитивы.
Пропсы в этом контексте становятся декларацией поведения, а не просто параметрами.
В продвинутых визуализациях используется система слоёв:
layers: [
'grid',
'axes',
'bars',
'markers',
'legends'
]
Каждый слой можно заменить кастомным React-компонентом.
Ключевая идея: график собирается как композиция независимых визуальных слоёв.
Система пропсов в Nivo построена по принципу декларативной зависимости:
Изменение обязательных пропсов приводит к перестроению модели данных и пересчёту визуальных элементов. Опциональные пропсы чаще влияют только на этап рендеринга.
Пример различия:
data → полная переработка сценыcolors → только перекраска элементовtheme → переопределение стилей без изменения
структурыВ TypeScript-окружении Nivo строго типизирует пропсы через generics:
<BarDatum, ExtraProps>
Это обеспечивает:
datakeysСуть модели: пропсы являются контрактом между данными, типами и визуализацией.
Каждый опциональный пропс имеет встроенное значение по умолчанию. Это позволяет запускать график с минимальной конфигурацией.
Однако дефолты не являются “нулевыми настройками”, они представляют собой заранее оптимизированный визуальный профиль:
Это означает, что отсутствие пропса — это не отсутствие поведения, а выбор встроенного сценария рендеринга.
При пересечении нескольких уровней конфигурации применяется следующая иерархия:
Например, цвет текста может быть переопределён:
themeПриоритет всегда отдаётся более конкретной декларации.