Подключение Chart.js в современных фронтенд-фреймворках требует учета
их реактивной модели, жизненного цикла компонентов и управления
DOM-элементами <canvas>. В каждом из подходов —
React, Vue и Angular — библиотека интегрируется через разные механизмы,
но базовая логика остается общей: создание canvas-элемента,
инициализация экземпляра графика, последующее обновление данных и
корректное уничтожение экземпляра при размонтировании компонента.
Chart.js работает напрямую с Canvas API, поэтому ключевой точкой
интеграции становится DOM-элемент <canvas>. В
SPA-фреймворках важно учитывать:
destroy() при
размонтировании.Базовый жизненный цикл выглядит следующим образом:
new Chart(ctx, config)chart.data +
chart.update()chart.destroy()В экосистеме React работа с Chart.js обычно строится через
useRef и useEffect, поскольку прямой доступ к
DOM ограничен декларативной моделью React.
import { useEffect, useRef } from "react";
import Chart from "chart.js/auto";
function LineChart() {
const canvasRef = useRef(null);
const chartRef = useRef(null);
useEffect(() => {
const ctx = canvasRef.current.getContext("2d");
chartRef.current = new Chart(ctx, {
type: "line",
data: {
labels: ["Jan", "Feb", "Mar", "Apr"],
datasets: [
{
label: "Продажи",
data: [12, 19, 3, 5],
borderColor: "blue",
},
],
},
});
return () => {
chartRef.current.destroy();
};
}, []);
return <canvas ref={canvasRef} />;
}
Обновление в React выполняется через изменение состояния и вызов
update():
chartRef.current.data.datasets[0].data = [5, 10, 15, 20];
chartRef.current.update();
useEffect заменяет lifecycle методыuseRef предотвращает повторное создание графикаВ Vue.js работа с Chart.js обычно строится через
onMounted и реактивные ref.
<template>
<canvas ref="canvas"></canvas>
</template>
<script setup>
import { ref, onMounted, onBeforeUnmount } from "vue";
import Chart from "chart.js/auto";
const canvas = ref(null);
let chartInstance = null;
onMounted(() => {
const ctx = canvas.value.getContext("2d");
chartInstance = new Chart(ctx, {
type: "bar",
data: {
labels: ["A", "B", "C"],
datasets: [
{
label: "Данные",
data: [10, 20, 30],
backgroundColor: "green",
},
],
},
});
});
onBeforeUnmount(() => {
if (chartInstance) {
chartInstance.destroy();
}
});
</script>
Vue позволяет автоматически реагировать на изменения:
watch(data, (newVal) => {
chartInstance.data.datasets[0].data = newVal;
chartInstance.update();
});
ref обеспечивает доступ к DOMwatch связывает реактивные данные и Chart.jsВ Angular чаще используется комбинация ViewChild и
жизненного цикла компонентов.
import { Component, ElementRef, ViewChild, AfterViewInit, OnDestroy } from '@angular/core';
import Chart from 'chart.js/auto';
@Component({
selector: 'app-chart',
template: `<canvas #canvas></canvas>`
})
export class ChartComponent implements AfterViewInit, OnDestroy {
@ViewChild('canvas') canvas!: ElementRef<HTMLCanvasElement>;
chart!: Chart;
ngAfterViewInit() {
const ctx = this.canvas.nativeElement.getContext('2d');
this.chart = new Chart(ctx!, {
type: 'pie',
data: {
labels: ['Red', 'Blue', 'Green'],
datasets: [{
data: [30, 40, 30]
}]
}
});
}
ngOnDestroy() {
if (this.chart) {
this.chart.destroy();
}
}
}
this.chart.data.datasets[0].data = [10, 20, 70];
this.chart.update();
AfterViewInit гарантирует доступ к DOMViewChild используется для canvas-ссылкиВо всех фреймворках сохраняется единая архитектурная модель управления:
useRefshallowRefОбновление происходит императивно:
chart.datachart.update()Критически важный этап:
Метод:
chart.destroy();
При интеграции с API или потоковыми данными применяется следующий паттерн:
Пример структуры данных:
{
labels: ["x1", "x2"],
datasets: [
{
label: "Метрика",
data: [1, 2]
}
]
}
При частых обновлениях данных в React, Vue и Angular учитываются следующие аспекты:
requestAnimationFrame при анимацияхdestroy() при размонтированииЧасто создается отдельный слой:
Он инкапсулирует:
| Фреймворк | Основной механизм доступа к DOM | Управление жизненным циклом |
|---|---|---|
| React | useRef + useEffect | хуки |
| Vue | ref + lifecycle hooks | onMounted / onUnmounted |
| Angular | ViewChild | AfterViewInit / OnDestroy |
Использование Chart.js в рамках React, Vue и Angular строится вокруг единой императивной модели управления графиком, адаптированной под декларативные ограничения каждого фреймворка.