SortableJS предоставляет мощные возможности для реализации интерактивного перетаскивания элементов в списках. Два ключевых события, позволяющих управлять логикой после перемещения элементов, — это onAdd и onRemove. Они применяются в ситуациях, когда элементы перемещаются между списками, а также при добавлении или удалении элементов из DOM через взаимодействие пользователя.
onAdd срабатывает, когда элемент был перенесён из другого списка и вставлен в текущий. Это событие полезно для синхронизации состояния данных при перемещении элементов между различными контейнерами.
Пример использования:
const list = document.getElementById('sortable-list');
Sortable.create(list, {
group: 'shared', // объединяет списки в одну группу для перемещения
animation: 150,
onAdd: function (evt) {
const item = evt.item; // DOM-элемент, который был добавлен
const newIndex = evt.newIndex; // индекс в новом списке
console.log(`Элемент добавлен: ${item.textContent} на позицию ${newIndex}`);
// Обновление модели данных
data.splice(newIndex, 0, item.dataset.id);
}
});
Ключевые свойства объекта события evt:
evt.item — DOM-элемент, который был добавлен.evt.from — исходный контейнер, откуда элемент был
перемещён.evt.to — новый контейнер, в который элемент
помещён.evt.oldIndex — индекс элемента в исходном списке.evt.newIndex — индекс элемента в новом списке.evt.clone — клонированный элемент при использовании
pull: 'clone'.Особенности использования:
group): чтобы событие onAdd
срабатывало при перемещении элементов, списки должны быть объединены в
группу. Значение group может быть строкой или объектом с
параметрами name, pull, put.evt.newIndex.onRemove вызывается в момент удаления элемента из текущего списка, когда он перемещается в другой список. Это событие критично для корректного удаления элементов из модели данных.
Пример:
Sortable.create(list, {
group: 'shared',
animation: 150,
onRemove: function (evt) {
const removedItem = evt.item;
const oldIndex = evt.oldIndex;
console.log(`Элемент удалён: ${removedItem.textContent} с позиции ${oldIndex}`);
// Обновление модели данных
data.splice(oldIndex, 1);
}
});
Свойства объекта evt, используемые в onRemove:
evt.item — удалённый DOM-элемент.evt.from — контейнер, из которого элемент был
удалён.evt.oldIndex — индекс элемента в исходном списке.evt.clone — клонированный элемент, если использовалось
клонирование.Особенности использования:
evt.clone для
обработки копии.При перемещении элемента между списками с включёнными событиями onAdd и onRemove, порядок срабатывания следующий:
Пример синхронизации двух массивов:
const listA = document.getElementById('list-a');
const listB = document.getElementById('list-b');
const dataA = ['a1', 'a2', 'a3'];
const dataB = ['b1', 'b2', 'b3'];
Sortable.create(listA, {
group: 'shared',
onAdd: function(evt) {
const itemId = evt.item.dataset.id;
dataA.splice(evt.newIndex, 0, itemId);
},
onRemove: function(evt) {
dataA.splice(evt.oldIndex, 1);
}
});
Sortable.create(listB, {
group: 'shared',
onAdd: function(evt) {
const itemId = evt.item.dataset.id;
dataB.splice(evt.newIndex, 0, itemId);
},
onRemove: function(evt) {
dataB.splice(evt.oldIndex, 1);
}
});
Такое сочетание гарантирует, что массивы dataA и
dataB полностью соответствуют визуальному состоянию списков
после всех перемещений.
evt.clone используется при настройке
pull: 'clone', когда элемент копируется вместо
перемещения.evt.pullMode указывает, была ли
операция копированием или перемещением.store для автоматического сохранения
состояния списков в localStorage.animation) улучшает визуальное
восприятие перемещения, но не влияет на работу onAdd и onRemove.Если требуется, могу дополнительно написать подробный пример перетаскивания с клонированием и синхронизацией нескольких массивов, где onAdd и onRemove используются в связке с drag-and-drop между тремя списками. Это покажет полный спектр возможностей SortableJS.