Для использования SortableJS необходимо подключить библиотеку. Она доступна через npm, CDN или локально. После подключения создаётся экземпляр Sortable, привязанный к элементу списка:
import Sortable from 'sortablejs';
const el = document.getElementById('items');
const sortable = Sortable.create(el, {
animation: 150
});
Ключевой момент: Sortable.create возвращает
объект, который содержит все методы для управления сортировкой и
взаимодействия с элементами списка.
option(name, value)Позволяет динамически изменять конфигурацию после инициализации.
const animation = sortable.option('animation');
sortable.option('animation', 300);
Особенность: Можно менять любые опции, которые
поддерживает SortableJS, в том числе group,
draggable, filter и другие.
toArray()Возвращает массив идентификаторов элементов списка. Для этого у
элементов должен быть установлен атрибут data-id.
const order = sortable.toArray();
console.log(order); // ['item1', 'item2', 'item3']
Полезно для: сохранения текущего порядка элементов на сервере.
sort(order)Сортирует элементы по массиву идентификаторов.
sortable.sort(['item3', 'item1', 'item2']);
Особенность: элементы, отсутствующие в массиве, остаются на своих местах, а новые элементы не добавляются.
save()Сохраняет текущее состояние списка в store, если
используется опция store.
sortable.save();
Применение: совместно с store для
автоматического восстановления порядка при перезагрузке страницы.
destroy()Удаляет экземпляр Sortable, снимая все слушатели событий и очищая внутренние данные.
sortable.destroy();
Важно: после вызова destroy объект
больше не пригоден для работы с этим элементом, потребуется повторная
инициализация.
closest(el)Возвращает ближайший родительский элемент, который управляется SortableJS.
const parent = Sortable.closest(document.getElementById('nested-item'));
Используется для: поиска контейнера, если элемент перемещён внутри вложенных списков.
option(name)Без второго аргумента возвращает текущее значение опции. Если передан второй аргумент, изменяет значение опции.
// Получение
const draggable = sortable.option('draggable');
// Изменение
sortable.option('draggable', '.item');
destroy()Удаляет все события и разрывает связь с DOM.
sortable.destroy();
Особенность: отличается от null или
удаления элемента DOM — объект полностью очищается.
serialize()Возвращает объект с данными о порядке элементов, обычно с атрибутом
data-id.
const data = sortable.serialize();
console.log(data); // { 'items': ['item1', 'item2', 'item3'] }
Применение: удобно для передачи состояния списка на сервер или сохранения локально.
Опция group позволяет создавать объединённые списки, где
элементы можно перетаскивать между контейнерами.
const sortableA = new Sortable(elA, { group: 'shared' });
const sortableB = new Sortable(elB, { group: 'shared' });
Методы toArray, sort, save
работают отдельно для каждого контейнера, но события onAdd,
onRemove и onUpdate позволяют синхронизировать
состояние.
SortableJS предоставляет множество событий, на которые можно подписываться:
onStart — начало перетаскивания.onEnd — завершение перетаскивания.onAdd — добавление элемента из другого списка.onUpdate — перестановка внутри одного списка.onRemove — удаление элемента в результате перемещения в
другой список.Пример:
sortable.option('onEnd', function (evt) {
console.log(`Элемент ${evt.item.dataset.id} перемещён`);
});
Опция filter позволяет исключить элементы из
сортировки.
sortable.option('filter', '.disabled');
sortable.option('onFilter', function (evt) {
evt.item.style.background = 'red';
});
Особенность: элементы, попавшие под фильтр, не могут быть перетаскиваемыми, но события могут быть обработаны отдельно.
SortableJS обеспечивает методы для прямой работы с элементами:
el — ссылка на DOM-элемент контейнера.dragged — элемент, который в данный момент
перетаскивается.active — флаг состояния, true если
перетаскивание активно.if (sortable.active) {
console.log('Перетаскивание активно');
}
SortableJS легко интегрируется с фреймворками: React, Vue, Angular.
Методы toArray, sort и события
onUpdate позволяют синхронизировать состояние списка с
виртуальным DOM и состоянием приложения.
Опция store позволяет автоматически сохранять порядок
элементов:
Sortable.create(el, {
store: {
get: function() {
return JSON.parse(localStorage.getItem('sortable-order') || '[]');
},
set: function(sortable) {
const order = sortable.toArray();
localStorage.setItem('sortable-order', JSON.stringify(order));
}
}
});
Методы save и serialize
тесно связаны с этой функциональностью и позволяют управлять сохранением
вручную.
Все перечисленные методы формируют полный набор инструментов для гибкого управления списками, перетаскиванием элементов и синхронизацией состояния в приложениях любого масштаба.