Для работы с SVG.js в проекте на React достаточно установить библиотеку через npm или yarn:
npm install @svgdotjs/svg.js
# или
yarn add @svgdotjs/svg.js
Импортировать можно как стандартный модуль:
import { SVG } from '@svgdotjs/svg.js';
В React рекомендуется создавать SVG-контейнеры в
useEffect или в методах жизненного цикла компонентов, чтобы
манипуляции с DOM происходили после рендера.
import React, { useRef, useEffect } from 'react';
import { SVG } from '@svgdotjs/svg.js';
function MySVGComponent() {
const containerRef = useRef(null);
useEffect(() => {
const draw = SVG().addTo(containerRef.current).size(300, 300);
draw.circle(100).fill('red').move(50, 50);
return () => draw.clear(); // Очистка при размонтировании
}, []);
return <div ref={containerRef}></div>;
}
SVG.js предоставляет интуитивный API для создания и изменения элементов. Основные методы:
rect(width, height) — создание прямоугольникаcircle(radius) — создание кругаellipse(width, height) — создание эллипсаline(x1, y1, x2, y2) — создание линииpolyline(points) и polygon(points) —
создание многоугольников и ломаных линийtext(content) — добавление текстаКаждый элемент поддерживает методы для трансформаций и стилей:
const rect = draw.rect(100, 50).fill('#3498db').stroke({ width: 2, color: '#2c3e50' });
rect.move(20, 30).rotate(45, 50, 25); // вращение вокруг центра элемента
rect.animate(1000).move(150, 100); // анимация перемещения
Группы позволяют объединять несколько элементов и управлять ими как единым объектом:
const group = draw.group();
group.add(draw.circle(50).fill('green').move(10, 10));
group.add(draw.rect(80, 40).fill('blue').move(60, 20));
group.rotate(30);
Группы особенно полезны при создании сложных интерактивных компонентов в React.
SVG.js поддерживает анимации через метод
animate:
circle.animate(2000, '<>').attr({ r: 80, fill: 'orange' });
Параметры:
'-'), ускорение
('>'), замедление ('<'), комбинации
('<>')Интерактивность добавляется через стандартные события:
rect.on('click', () => rect.fill({ color: '#e74c3c' }));
rect.on('mouseover', () => rect.opacity(0.7));
rect.on('mouseout', () => rect.opacity(1));
В React важно учитывать синхронизацию с состоянием:
const [color, setColor] = React.useState('blue');
useEffect(() => {
const rect = draw.rect(100, 50).fill(color);
rect.on('click', () => setColor(color === 'blue' ? 'red' : 'blue'));
}, [color]);
Для повторного использования SVG-элементов удобно оборачивать их в отдельные компоненты:
function AnimatedCircle({ radius, color, x, y }) {
const ref = useRef(null);
useEffect(() => {
const draw = SVG().addTo(ref.current).size(200, 200);
const circle = draw.circle(radius * 2).fill(color).move(x, y);
circle.animate(1000).attr({ r: radius * 1.5 });
return () => draw.clear();
}, [radius, color, x, y]);
return <div ref={ref}></div>;
}
Такой подход позволяет использовать props для динамических анимаций и стилей, что идеально сочетается с React-паттернами.
SVG.js упрощает сложные трансформации:
move(x, y) — перемещениеcenter(cx, cy) — установка центраrotate(angle, cx, cy) — вращениеscale(sx, sy, cx, cy) — масштабированиеskew(xAngle, yAngle) — наклонТрансформации можно комбинировать:
rect.move(50, 50).rotate(30).scale(1.5, 1.5).skew(10, 0);
Для реактивных интерфейсов в React можно привязывать эти
трансформации к состоянию или анимационным библиотекам вроде
framer-motion.
SVG.js удобно интегрируется с динамическими данными:
const data = [
{ x: 10, y: 50, r: 20 },
{ x: 70, y: 80, r: 15 },
{ x: 130, y: 40, r: 25 },
];
data.forEach(d => {
draw.circle(d.r * 2).fill('teal').center(d.x, d.y);
});
Можно создавать графики, диаграммы или интерактивные схемы, комбинируя React state и методы SVG.js.
Метод text поддерживает форматирование:
const txt = draw.text('Hello SVG.js')
.font({ size: 24, family: 'Arial', anchor: 'middle', leading: '1.5em' })
.move(100, 50);
SVG.js позволяет задавать стили подтекстов, tspan, выравнивание, обрезку текста и цвет.
SVG.js работает напрямую с DOM-элементами, что позволяет:
const svgString = draw.svg(); // получение SVG-кода
const filter = draw.filter();
filter.blur(3);
rect.filterWith(filter);
Фильтры создают визуальные эффекты без изменения базовой геометрии.
useRef для контейнеров, чтобы избежать
лишних рендеровdraw.clear() или draw.remove())nested SVG
для управления слоямиЭти принципы позволяют создавать интерактивные и динамические SVG-компоненты, полностью интегрированные с архитектурой React.