В библиотеке Shopify Draggable управление состоянием элементов играет ключевую роль для построения интерактивного интерфейса. Состояние элементов определяет, какие из них активны, перемещаются, находятся в состоянии ожидания и как они реагируют на события пользователя. Draggable предоставляет встроенные механизмы для отслеживания и изменения этого состояния через события и классы CSS.
Draggable использует подписку на события для управления состоянием. Основные события включают:
drag:start — инициируется при начале перетаскивания. В
момент этого события элемент получает состояние активного
перетаскивания.drag:move — происходит на каждом кадре движения
элемента. Используется для обновления позиции и взаимодействия с другими
объектами.drag:stop — завершается процесс перетаскивания. Элемент
возвращается в исходное состояние или принимает новое в зависимости от
логики сортировки.sortable:swap — вызывается при смене позиции элементов
в sortable контейнере, что позволяет синхронизировать визуальное
состояние с внутренним порядком.sortable:sorted — фиксирует итоговое состояние после
завершения сортировки, позволяя обновлять данные в модели.Каждое событие передаёт объект Event, содержащий
информацию о состоянии перетаскиваемого элемента, его родителя, позиции
и индексах. Использование этих данных позволяет реализовать детальное
управление состоянием без прямой модификации DOM.
Draggable автоматически добавляет CSS-классы для отражения текущего состояния:
draggable--is-dragging — элемент находится в процессе
перетаскивания.draggable--is-moving — элемент перемещается внутри
контейнера.draggable--is-swapping — временное состояние при
перестановке с другим элементом.draggable--over — указывает на пересечение с
потенциальным целевым контейнером.Эти классы можно использовать для динамического изменения стиля элементов, отображения подсказок, анимаций и визуальной обратной связи. Для полного контроля рекомендуется комбинировать CSS-классы с событиями Draggable, чтобы состояние всегда соответствовало логике приложения.
В сложных интерфейсах требуется синхронизация состояния Draggable с внутренней моделью данных. Для этого используют:
id или
data-* атрибут. Это позволяет точно сопоставлять визуальное
состояние с данными.sortable:swap и sortable:sorted изменяется
порядок элементов в массиве. Это обеспечивает актуальность состояния
модели относительно DOM.Пример синхронизации с моделью данных:
const draggable = new Draggable.Sortable(container, {
draggable: '.item'
});
draggable.on('sortable:sorted', (event) => {
const { oldIndex, newIndex } = event;
myDataArray.splice(newIndex, 0, myDataArray.splice(oldIndex, 1)[0]);
});
Draggable позволяет изменять состояние возможности перетаскивания элементов без пересоздания экземпляра. Методы:
draggable.disable() — полностью блокирует
перетаскивание всех элементов.draggable.enable() — возвращает возможность
перемещения.draggable.destroy() — полностью удаляет управление
состоянием и очищает слушатели событий.Для отдельных элементов можно управлять состоянием через атрибуты или
проверку внутри события drag:start:
draggable.on('drag:start', (event) => {
if (event.source.classList.contains('locked')) {
event.cancel();
}
});
Shopify Draggable тесно интегрируется с анимациями состояния
элементов через CSS transitions и
requestAnimationFrame. Использование событий
drag:move и sortable:swap позволяет плавно
обновлять позиции элементов, изменять прозрачность, масштаб и цвет для
визуального отображения состояния:
.item {
transition: transform 0.2s ease, opacity 0.2s ease;
}
.item.draggable--is-dragging {
opacity: 0.8;
transform: scale(1.05);
}
Такой подход поддерживает консистентность состояния и улучшает UX без необходимости сложного управления DOM вручную.
sortable:sorted), чтобы состояние
модели оставалось точным.Эффективное управление состоянием позволяет реализовать:
Эти подходы делают управление состоянием в Shopify Draggable гибким, предсказуемым и легко расширяемым для любых интерфейсов.