В Shopify Draggable сенсоры представляют собой
объекты, отслеживающие взаимодействие пользователя с элементами на
странице. Сенсор фиксирует начальные координаты, движение курсора или
пальца, а также события начала, перемещения и завершения взаимодействия.
В библиотеке Draggable встроены стандартные сенсоры:
MouseSensor, TouchSensor и Sensor
для кастомных решений. Основная задача кастомного сенсора — определить,
когда элемент должен реагировать на пользовательское действие и передать
эту информацию в систему Draggable.
Кастомный сенсор создается через наследование базового класса
Sensor. Минимальная реализация требует переопределения
методов attach(), detach() и
start().
import { Sensor } from '@shopify/draggable';
class CustomSensor extends Sensor {
attach() {
this.el.addEventListener('mousedown', this.onMouseDown);
}
detach() {
this.el.removeEventListener('mousedown', this.onMouseDown);
}
onMouseD own = (event) => {
event.preventDefault();
this.start(event);
}
start(event) {
const position = { x: event.clientX, y: event.clientY };
this.trigger('start', { sourceEvent: event, position });
}
}
Ключевые моменты:
attach() — регистрирует обработчики событий на
элементе.detach() — удаляет обработчики, предотвращая утечки
памяти.start(event) — инициирует событие start,
передавая координаты и исходное событие.После создания кастомного сенсора его нужно подключить к экземпляру
Draggable через конфигурацию sensors. Пример
интеграции:
import { Draggable } from '@shopify/draggable';
const draggable = new Draggable(document.querySelectorAll('.draggable'), {
draggable: '.item',
sensors: [CustomSensor]
});
draggable.on('drag:start', (event) => {
console.log('Начало перетаскивания:', event.sourceEvent);
});
События, инициируемые сенсором, автоматически становятся частью
жизненного цикла Draggable: drag:start,
drag:move, drag:stop.
Кастомный сенсор может отслеживать дополнительные условия:
x или
y)Пример ограничения перемещения по оси y:
start(event) {
const position = { x: 0, y: event.clientY }; // игнорируем x
this.trigger('start', { sourceEvent: event, position });
}
Draggable позволяет подключать несколько сенсоров одновременно. Это полезно для поддержки разных устройств ввода. При этом каждый сенсор должен корректно обрабатывать события, чтобы не возникало конфликтов.
import { MouseSensor, TouchSensor } from '@shopify/draggable';
const draggable = new Draggable(document.querySelectorAll('.draggable'), {
draggable: '.item',
sensors: [MouseSensor, TouchSensor, CustomSensor]
});
События от сенсоров будут объединяться в единую систему обработки перетаскивания.
Кастомные сенсоры могут генерировать большое количество событий
mousemove или touchmove. Для повышения
производительности рекомендуется:
requestAnimationFrame для обновления
позиции элементов.trigger().Пример оптимизации через requestAnimationFrame:
onMouseM ove = (event) => {
if (this.raf) cancelAnimationFrame(this.raf);
this.raf = requestAnimationFrame(() => {
this.trigger('move', { sourceEvent: event, position: { x: event.clientX, y: event.clientY } });
});
};
Кастомные сенсоры особенно полезны в случаях:
Каждый из этих сценариев требует тщательной работы с координатами, событиями и синхронизацией с жизненным циклом Draggable.
start,
move, stop.Кастомные сенсоры позволяют полностью контролировать способ, которым элементы реагируют на действия пользователя, расширяя стандартный функционал Shopify Draggable и обеспечивая гибкую интеграцию в сложные интерфейсы.