Паттерн enter-update-exit представляет собой стратегию управления элементами SVG в динамических визуализациях. Он заимствован из подхода D3.js, но в Snap.svg реализуется через комбинацию методов для добавления, изменения и удаления графических элементов на холсте.
Этот паттерн условно делится на три этапа:
Использование этого подхода позволяет эффективно управлять графикой, предотвращая избыточное создание объектов и поддерживая синхронизацию визуализации с состоянием данных.
Этап enter отвечает за рендеринг объектов, которых ранее не было на холсте. Основная задача — создать новые SVG-элементы на основе данных.
Пример:
var s = Snap("#svgCanvas");
var data = [50, 100, 150, 200];
data.forEach(function(d, i){
s.circle(50 + i * 60, 100, d / 10)
.attr({
fill: "#3498db",
stroke: "#2980b9",
strokeWidth: 2
});
});
В этом примере массив data порождает новые круги на
холсте. Каждый элемент массива преобразуется в графический объект, что
соответствует шагу enter.
Ключевые моменты этапа Enter:
На этапе update уже созданные элементы изменяются в
соответствии с новым состоянием данных. Snap.svg предоставляет методы
attr() и animate() для динамического
обновления атрибутов и свойств элементов.
Пример:
var circles = s.selectAll("circle");
var newData = [80, 60, 120, 180];
circles.forEach(function(circle, i){
circle.animate({
r: newData[i] / 10,
fill: "#e74c3c"
}, 800, mina.easeinout);
});
Особенности этапа Update:
Этап exit отвечает за удаление элементов, которые больше не нужны, чтобы визуализация соответствовала текущим данным.
Пример удаления элементов:
var updatedData = [100, 150];
s.selectAll("circle").forEach(function(circle, i){
if(i >= updatedData.length){
circle.remove();
}
});
Особенности этапа Exit:
remove().var s = Snap("#svgCanvas");
// Изначальные данные
var data = [40, 80, 120];
// Этап Enter
data.forEach(function(d, i){
s.circle(50 + i * 70, 100, d / 10)
.attr({ fill: "#3498db", stroke: "#2980b9", strokeWidth: 2 });
});
// Новые данные через некоторое время
setTimeout(function(){
var newData = [60, 100, 140, 180];
var circles = s.selectAll("circle");
// Update
circles.forEach(function(circle, i){
if(i < newData.length){
circle.animate({ r: newData[i]/10, fill: "#e67e22" }, 600, mina.easeinout);
} else {
// Exit
circle.animate({ opacity: 0 }, 600, mina.easeinout, function(){
this.remove();
});
}
});
// Enter для новых элементов
for(var i = circles.length; i < newData.length; i++){
s.circle(50 + i * 70, 100, 0)
.attr({ fill: "#2ecc71", stroke: "#27ae60", strokeWidth: 2 })
.animate({ r: newData[i]/10 }, 600, mina.easeinout);
}
}, 2000);
Этот пример демонстрирует синхронизацию данных с элементами SVG: старые объекты обновляются или удаляются, новые создаются, а все изменения сопровождаются плавной анимацией.
forEach или
map для обхода и соответствия данных элементам.Паттерн enter-update-exit в Snap.svg обеспечивает эффективное управление динамической графикой и позволяет создавать визуализации, полностью синхронизированные с изменяющимися данными.