SortableJS — это мощная библиотека для реализации перетаскивания элементов в списках и сетках на веб-странице. Одним из ключевых аспектов работы с SortableJS является получение нового порядка элементов после того, как пользователь изменил их расположение. Это особенно важно для сохранения состояния списка на сервере или локально.
После инициализации SortableJS у контейнера можно получить актуальный порядок элементов несколькими способами.
toArray()Метод toArray() возвращает массив идентификаторов
элементов в текущем порядке. Для корректной работы необходимо присвоить
каждому элементу уникальный id:
const list = document.getElementById('sortable-list');
const sortable = Sortable.create(list, {
animation: 150,
});
const currentOrder = sortable.toArray();
console.log(currentOrder);
Ключевые моменты:
id
элементов.onEndСобытие onEnd вызывается после завершения
перетаскивания. Это удобное место для получения обновлённого
порядка:
const sortable = Sortable.create(list, {
animation: 150,
onEnd: function (evt) {
const upd atedOrder = sortable.toArray();
console.log('Новый порядок элементов:', updatedOrder);
}
});
Особенности:
evt содержит информацию о перемещённом
элементе: индекс, старое и новое положение.sort() и пользовательская
сериализацияЕсли требуется работать не с id, а с данными внутри
элементов, можно использовать метод sort() для создания
кастомного массива:
const updatedData = Array.from(list.children).map(item => item.dataset.value);
console.log(updatedData);
Преимущества:
data-* атрибутах.id.store: встроенный механизм сохранения
состояния списка. Позволяет автоматически сохранять порядок в
localStorage:const sortable = Sortable.create(list, {
animation: 150,
store: {
se t: function (sortable) {
const order = sortable.toArray();
localStorage.setItem(sortable.options.group.name, order.join('|'));
},
get: function (sortable) {
const order = localStorage.getItem(sortable.options.group.name);
return order ? order.split('|') : [];
}
}
});
dataIdAttr: если элементы используют
не id, а собственный атрибут для идентификации, можно
указать его:Sortable.create(list, {
dataIdAttr: 'data-item-id'
});
SortableJS поддерживает вложенные списки. Для получения порядка элементов в таких структурах используется рекурсивный обход:
function getNestedOrder(container) {
return Array.from(container.children).map(item => {
const childList = item.querySelector('.nested-list');
return {
id: item.dataset.id,
children: childList ? getNestedOrder(childList) : []
};
});
}
console.log(getNestedOrder(list));
Пояснения:
toArray().Sortable.create() с
обновлённым списком.onEnd подходит для мгновенного реагирования на
изменение порядка, а store — для долговременного хранения
состояния.data-* атрибуты.Получение нового порядка элементов в SortableJS — это гибкая система, которая позволяет как быстро получить массив идентификаторов, так и реализовать сложную кастомную сериализацию для вложенных списков и интеграции с серверной логикой.