В библиотеке Nivo интерактивность строится вокруг событий пользовательского ввода и реактивного обновления состояния. Любой график (bar, line, pie, radar и др.) изначально поддерживает набор встроенных взаимодействий: наведение, выделение элементов, клики, управление легендой и отображение подсказок.
Интерактивность в Nivo не требует ручного управления DOM-элементами. Вместо этого используются декларативные свойства компонентов и callback-функции, которые позволяют реагировать на действия пользователя на уровне данных.
Ключевые источники интерактивности:
Каждый график Nivo принимает набор обработчиков событий, которые привязываются к визуальным элементам: барам, точкам, дугам, сегментам.
Пример типового набора событий:
onClickonMouseEnteronMouseMoveonMouseLeaveЭти события возвращают объект данных, связанный с конкретным элементом визуализации. Это позволяет работать не с DOM, а с бизнес-данными.
<ResponsiveBar
data={data}
keys={['value']}
indexBy="label"
onCl ick={(datum) => {
console.log('Клик по:', datum);
}}
/>
Каждый datum содержит:
Наведение мыши является базовым способом взаимодействия с графиками. Nivo автоматически управляет состояниями hover, изменяя:
В line chart и bar chart поведение hover особенно выражено: элементы под курсором становятся визуально доминирующими, а остальные элементы приглушаются.
Пример настройки поведения:
<ResponsiveLine
data={data}
useMesh={true}
enablePoints={true}
/>
Параметр useMesh включает виртуальную сетку для более
точного определения точки наведения, что критично при плотных
данных.
Подсказки — центральный элемент интерактивности. В Nivo tooltip строится как React-компонент, что позволяет полностью контролировать его содержимое и стили.
Базовый tooltip:
tooltip={({ point }) => (
<div style={{ background: 'white', padding: 12 }}>
<strong>{point.data.x}</strong>
<div>{point.data.y}</div>
</div>
)}
Tooltip получает контекст элемента:
Tooltip может быть полностью переопределён. Это позволяет внедрять:
Пример расширенного tooltip:
tooltip={({ datum }) => (
<div>
<div>Категория: {datum.label}</div>
<div>Значение: {datum.value}</div>
<div>Доля: {(datum.value / datum.total * 100).toFixed(1)}%</div>
</div>
)}
В линейных графиках tooltip может быть привязан не к конкретной точке, а к позиции курсора. Это позволяет анализировать непрерывные данные.
Используется режим mesh:
useMesh={true}
Он создаёт виртуальную триангуляцию между точками, позволяя точно определять ближайшее значение.
Дополнительно можно использовать:
Nivo поддерживает концепцию активного элемента, который отличается от hover тем, что состояние может сохраняться.
Активное состояние применяется через:
isInteractiveПример ручного управления:
const [activeId, setActiveId] = useState(null);
<ResponsiveBar
data={data}
onCl ick={(bar) => setActiveId(bar.id)}
borderWidth={d => d.id === activeId ? 3 : 1}
/>
Это позволяет реализовывать:
Легенда в Nivo не является статическим элементом. Она может управлять видимостью данных.
Основные сценарии:
Пример кастомной легенды:
legends={[
{
onClick: (datum) => {
console.log('toggle series', datum.id);
}
}
]}
Легенда становится управляющим интерфейсом для графика, а не просто подписью.
Интерактивность Nivo часто выходит за пределы одного графика. Распространённый паттерн — синхронизация нескольких визуализаций.
Пример сценария:
Реализация через общий state:
const [selected, setSelected] = useState(null);
<Bar onCl ick={(d) => setSelected(d.id)} />
<Line data={filter(data, selected)} />
Это создаёт связанный аналитический интерфейс.
Интерактивность в Nivo тесно связана с анимациями. Любое изменение состояния сопровождается переходами:
Параметр animate управляет этим поведением:
animate={true}
motionConfig="gentle"
Анимация усиливает восприятие изменений, особенно при:
В pie и radial графиках hover вызывает более сложные трансформации:
activeOuterRadiusOffset={8}
Это создаёт эффект “всплывающего” сегмента, который визуально отделяется от круга.
Nivo позволяет добавлять собственные слои поверх графиков. Это открывает возможность для глубокой кастомизации взаимодействий.
Слои могут:
layers={[
'grid',
'axes',
'bars',
CustomLayer
]}
Custom layer получает доступ к координатам и данным, что позволяет строить сложные интерактивные оверлеи.
Хотя Nivo не является drag-and-drop библиотекой, можно реализовать поведение, близкое к перетаскиванию:
Особенно это актуально для line charts.
Пример логики выделения диапазона:
Это используется для:
При высокой плотности данных интерактивность становится узким местом. В Nivo применяются оптимизации:
Критически важные параметры:
enablePointsuseMeshanimatemotionConfigИнтерактивные элементы Nivo могут быть адаптированы для клавиатурной навигации и screen reader:
Это особенно важно для аналитических панелей, где график — основной интерфейс взаимодействия с данными.
Клик по элементу часто используется для вызова внешних действий:
onCl ick={(d) => {
openModal(d.data);
}}
Таким образом график становится навигационным элементом интерфейса.
Сложные интерфейсы часто комбинируют временное и фиксированное состояние:
Логика разделения:
Это формирует двухуровневую модель взаимодействия, характерную для аналитических панелей.