Олег Марков
Использование Chart.js в React
Введение
Визуализация данных — неотъемлемая часть современного веба. Графики позволяют легче понять тренды и делать выводы на основе информации. В мире React вы найдете много решений для диаграмм, но одним из самых популярных считается Chart.js — мощная и гибкая JavaScript библиотека с поддержкой разных типов графиков и отличной документацией. В этой статье вы узнаете, как интегрировать Chart.js в React-приложение, строить основные типы графиков, делать их интерактивными и кастомизировать под задачи вашего проекта.
Почему именно Chart.js в паре с React
Chart.js славится простотой, богатым набором функций, возможностью кастомизации и поддержкой самых разных типов диаграмм — от стандартных столбчатых и линейных до "пончиковых" и радужных графиков. Однако Chart.js — это чисто JS библиотека: она напрямую работает с canvas и DOM, а управление жизненным циклом компонентов React — особенная задача. Для удобной интеграции часто используют специальные "обертки", такие как react-chartjs-2.
Установка необходимых библиотек
Перед тем как приступить к практике, давайте подключим Chart.js в проект.
npm install chart.js react-chartjs-2
chart.js
— сама библиотека для отрисовки графиковreact-chartjs-2
— адаптер, который превращает Chart.js-компоненты в полноценные React-компоненты
Основы использования Chart.js в React
Быстрый старт: построение первого графика
Сейчас покажу простой пример рисования линейного графика.
Импортируем необходимые компоненты
import { Line } from 'react-chartjs-2'; // Импортируем компонент линии
import {
Chart as ChartJS,
CategoryScale,
LinearScale,
PointElement,
LineElement,
Title,
Tooltip,
Legend
} from 'chart.js';
// Регистрируем нужные модули Chart.js (обязательный шаг)
ChartJS.register(
CategoryScale, LinearScale, PointElement, LineElement, Title, Tooltip, Legend
);
Определяем данные и опции графика
const data = {
labels: ['Янв', 'Фев', 'Мар', 'Апр', 'Май', 'Июн'],
datasets: [
{
label: 'Продажи',
data: [150, 200, 180, 220, 210, 250], // Здесь сами значения
fill: false, // Без заливки под кривой
borderColor: 'rgba(75,192,192,1)', // Цвет линии
tension: 0.1, // Плавность кривой
},
],
};
const options = {
responsive: true, // Масштабируется под контейнер
plugins: {
legend: {
display: true,
position: 'top', // Положение легенды
},
title: {
display: true,
text: 'График продаж по месяцам', // Название графика
},
},
};
Встраиваем график в компонент
function SalesLineChart() {
return (
<div style={{ height: 400, width: 600 }}>
<Line data={data} options={options} /> {/* Рисуем! */}
</div>
);
}
// Теперь можно использовать <SalesLineChart /> в любом месте React-приложения
Здесь мы задали линии, подписи, цвет и отобразили график. Chart.js автоматически обработает все взаимодействия с мышью, легенды и текущие значения точек.
Доступные типы графиков и их компоненты
react-chartjs-2
поддерживает почти все стандартные виды графиков Chart.js:
Line
— линейный графикBar
— столбчатый графикDoughnut
— "пончиковый" графикPie
— круговая диаграммаRadar
— радиальный графикPolarArea
— полярная область- и другие (Bubble, Scatter)
Покажу, как на лету менять вид графика — например, строить столбчатую диаграмму:
import { Bar } from 'react-chartjs-2';
function SalesBarChart() {
return <Bar data={data} options={options} />;
}
Вы можете использовать один и тот же набор данных для разных типов графиков, просто меняя компонент!
Chart.js - это библиотека для создания интерактивных графиков и диаграмм в веб-приложениях. Интеграция Chart.js с React позволяет легко добавлять графики в React-приложения и визуализировать данные. Если вы хотите научиться использовать Chart.js в React и создавать красивые и информативные графики — приходите на наш большой курс Основы React, React Router и Redux Toolkit. На курсе 177 уроков и 17 упражнений, AI-тренажеры для безлимитной практики с кодом и задачами 24/7, решение задач с живым ревью наставника, еженедельные встречи с менторами.
Структура данных и опций: Как всё устроено
Пояснение по структуре data
Ключевое — массив datasets
. Каждый элемент — это линия/серия на графике.
const data = {
labels: ['A', 'B', 'C'],
datasets: [
{
label: 'Значения A',
data: [10, 20, 30],
backgroundColor: 'rgba(255,99,132,0.5)', // Для bar/pie
borderColor: 'rgba(255,99,132,1)', // Для line
}
]
};
labels
— подписи для оси Xdatasets
— массив объектов, в каждом из которых:label
— подпись серииdata
— массив значений- цветовые и стилистические параметры
Основные опции (options
)
Опции настраивают управление осями, легендами, подписями, обработчиками событий, масштабирование и многое другое.
const options = {
scales: {
y: {
beginAtZero: true, // Ось Y начинается с 0
title: { display: true, text: 'Количество' }
},
x: {
title: { display: true, text: 'Период' }
},
},
plugins: {
legend: {
display: true,
position: 'bottom'
}
}
};
Кастомизация графиков: Цвета, стили, точки
Изменение цветов и оформления
Можно использовать как строки с CSS-цветами, так и массивы цветов (свойство применится к каждому сегменту):
const data = {
labels: ['A', 'B', 'C'],
datasets: [
{
label: 'Пример',
data: [100, 200, 300],
backgroundColor: [
'rgba(255, 99, 132, 0.7)',
'rgba(54, 162, 235, 0.7)',
'rgba(255, 206, 86, 0.7)'
],
borderWidth: 2, // Толщина линий/границ
}
]
};
- Для линейных — используйте
borderColor
иbackgroundColor
- Для "пончиков"/"пирогов" — передавайте массив цветов, как выше
Индивидуальные стили точек
Можно настроить для каждой точки (например, разный размер или цвет):
const data = {
// ...общие данные
datasets: [
{
// ...
pointBackgroundColor: ['red', 'green', 'blue'], // Цвет каждой точки по очереди
pointRadius: [5, 10, 15], // Размеры точек
}
]
};
Chart.js по умолчанию назначит значения из массива последовательно точкам на линии.
Управление обновлением, динамика и реакт-состояние
Графики и состояние React
Вам наверняка понадобится строить графики с динамическими данными — например, их получает API или они меняются при действиях пользователя. Всё, что нужно — передавать data
и options
не как константы, а генерировать из состояния.
import React, { useState } from 'react';
import { Line } from 'react-chartjs-2';
function DynamicChart() {
// Храним значения продаж в состоянии
const [sales, setSales] = useState([100, 120, 80, 140, 160, 180]);
// Обновляем данные, если надо (например, при клике)
const handleUpdate = () => {
setSales(sales.map(val => val + Math.round(Math.random() * 10 -
5))); // Простое случайное обновление
};
const data = {
labels: ['Янв', 'Фев', 'Мар', 'Апр', 'Май', 'Июн'],
datasets: [{
label: 'Продажи',
data: sales,
borderColor: 'blue'
}]
};
return (
<div>
<Line data={data} />
<button onClick={handleUpdate}>Обновить данные</button>
</div>
);
}
Chart.js автоматически обновляется при каждом изменении данных.
Работа с асинхронными данными
Ещё один пример — получение данных из API:
import { useEffect, useState } from 'react';
import { Bar } from 'react-chartjs-2';
function AsyncChart() {
const [chartData, setChartData] = useState(null);
useEffect(() => {
// Симулируем загрузку
setTimeout(() => {
setChartData({
labels: ['A', 'B', 'C'],
datasets: [{
label: 'API данные',
data: [42, 55, 78],
backgroundColor: 'purple'
}]
});
}, 1000); // Задержка 1 сек
}, []);
// Пока данные не загружены — просто сообщаем об этом
if (!chartData) return <div>Загрузка данных…</div>;
return <Bar data={chartData} />;
}
Так вы можете легко интегрировать Chart.js с любыми источниками данных.
Кастомизация подписей, тултипов и легенды
Легенда
Включается и выключается через опции:
const options = {
plugins: {
legend: {
display: true,
position: 'top', // top, left, right, bottom
labels: {
color: 'gray', // Цвет текста легенды
font: {
size: 14,
}
}
}
}
};
Подписи осей
const options = {
scales: {
x: { title: { display: true, text: 'Время' } },
y: { title: { display: true, text: 'Значение' } }
}
};
Тултипы: Настройка подсказок при наведении
const options = {
plugins: {
tooltip: {
enabled: true, // Включить тултипы
callbacks: {
label: function(context) {
// Кастомная строка, которую видит пользователь
return `Значение: ${context.parsed.y}`;
}
}
}
}
};
Раздел callbacks позволяет настраивать внешний вид tooltip вплоть до формата вывода.
Обработка кликов и событий пользователя
Chart.js поддерживает взаимодействие с пользователем через события.
Пример: обработать клик по элементу графика
import { Chart as ChartJS } from 'chart.js';
import { Line } from 'react-chartjs-2';
function ClickableChart({ data, options }) {
const chartRef = React.useRef();
const onClick = (event) => {
const chart = chartRef.current;
if (!chart) return;
const points = chart.getElementsAtEventForMode(
event.nativeEvent,
'nearest',
{ intersect: true },
true
);
if (points.length) {
const firstPoint = points[0];
const label = data.labels[firstPoint.index];
const value = data.datasets[firstPoint.datasetIndex].data[firstPoint.index];
alert(`Вы кликнули по: ${label} (значение: ${value})`);
}
};
return (
<Line data={data} options={options} ref={chartRef} onClick={onClick} />
);
}
Смотрите, здесь используется реф, чтобы получить ссылку на ChartJS экземпляр.
Адаптация и рендеринг в разных размерах
Chart.js рендерит диаграммы в canvas
, автоматически подгоняя размеры при установленной опции responsive: true
(по умолчанию). Вы можете ограничивать размеры графика через контейнер:
<div style={{ maxWidth: 600, height: 400 }}>
<Line data={data} options={options} />
</div>
Дополнительно, вы можете влиять на размеры текста, линий, точек, чтобы график хорошо смотрелся на мобильных устройствах.
Оптимизация производительности больших графиков
Для больших объемов данных:
- Отключайте лишние плагины (легенды, тултипы), если не используете их.
- Используйте опцию
animation: false
для отключения анимации на больших массивах данных. - Если требуется прокрутка, используйте виртуализацию данных (например, отображайте не все точки, а агрегированные значения).
const options = {
animation: false, // Отключить анимацию
};
Типичные ошибки при работе с Chart.js в React
- Не зарегистрировали компоненты/mixins (как в примере выше — обязательно
ChartJS.register(...)
) - Путают работу с рефами и событиями
- Пытаются напрямую модифицировать данные без реакт-состояния
- Используют старые версии Chart.js или react-chartjs-2 (они не совместимы между собой)
- Передают пустые или некорректные данные
Обратите внимание и вы избежите многих проблем!
Лучшие практики и советы
- Храните данные графика в состоянии, чтобы автоматом реагировать на любые изменения
- Используйте useRef только для особых ситуаций (например, обработки кликов на графике)
- По возможности выносите опции в отдельные функции/константы для удобства поддержки
- Не забывайте про мобильную адаптивность
- Тщательно подбирайте цвета и подписывайте оси/легенду — это сильно улучшает читаемость
Заключение
Chart.js и React — отличная комбинация для визуализации данных. С помощью связки react-chartjs-2 и пушистого API самого Chart.js вы получите интерактивные, быстро обновляемые и красивые графики для любого применения. В этой статье вы увидели: как подключить библиотеку, разобраться в структуре данных, гибко настроить внешний вид, динамически обновлять данные и обрабатывать события. Такой подход применим для построения дашбордов, отчетов и любых интерфейсов работы с данными.
Chart.js позволяет визуализировать данные. Для создания сложных приложений требуется умение управлять состоянием и роутингом. Рассмотрите курс Основы React, React Router и Redux Toolkit для получения необходимых навыков. В первых 3 модулях уже доступно бесплатное содержание — начните погружаться в основы React уже сегодня.
Частозадаваемые технические вопросы по теме и ответы
1. Как скачать изображение или сохранить график в файл из React?
Вы можете получить ссылку на canvas и использовать стандартный метод toDataURL Chart.js: ```jsx const chartRef = React.useRef();
const downloadImage = () => { const chartInstance = chartRef.current; if (chartInstance) { const url = chartInstance.toBase64Image(); const link = document.createElement('a'); link.href = url; link.download = 'chart.png'; link.click(); } };
// Передайте ref в компонент Line/Bar и добавьте кнопку для вызова downloadImage ```
2. Как добавить аннотации (например, линии на определенных значениях)?
Chart.js требует отдельного плагина — chartjs-plugin-annotation:
bash
npm install chartjs-plugin-annotation
Затем подключите и регистрируйте плагин. После этого в options.plugins.annotation
описываются нужные элементы — линии, области и текстовые метки.
3. Как программно обновить график без необходимости перерисовывать весь компонент?
Chart.js в связке с React сам перерисовывает график при изменении пропсов data и options. Если нужно обновлять только часть данных (например, добавить новую точку), достаточно изменить данные в состоянии и передать их в компонент.
4. Как удалить или изменить подписи к отдельным точкам на графике?
Для скрытия подписей используйте массив labels, где на нужных индексов вместо текста указывайте пустую строку (“”). Для кастомных подписей можно реализовать кастомизацию через опцию plugins.tooltip.callbacks
и plugins.legend.callbacks
.
5. Как реализовать комбинированные графики (например, столбцы и линии на одном холсте)?
Chart.js поддерживает комбинированные графики. Просто в массиве datasets указывайте для каждой серии свой тип (например, type: 'line' или type: 'bar') и используйте компонент Chart из react-chartjs-2.
Постройте личный план изучения React до уровня Middle — бесплатно!
React — часть карты развития Frontend
100+ шагов развития
30 бесплатных лекций
300 бонусных рублей на счет
Бесплатные лекции
Все гайды по React
Лучшие курсы по теме

React и Redux Toolkit
Антон Ларичев
TypeScript с нуля
Антон Ларичев