В библиотеке Shopify Draggable сенсоры отвечают за отслеживание взаимодействий с элементами на странице, таких как перетаскивание, нажатие и прокрутка. Комбинирование нескольких сенсоров позволяет создавать сложные сценарии взаимодействия, расширяя стандартные возможности библиотеки.
В Draggable сенсоры реализованы как отдельные классы, наследующиеся
от базового класса Sensor. Каждый сенсор имеет свои методы
и события, но при комбинировании важно правильно управлять их
приоритетом и взаимодействием.
mousedown, mousemove,
mouseup.touchstart, touchmove,
touchend.Каждый сенсор может работать автономно, но их комбинирование позволяет, например, поддерживать одновременно мобильные и десктопные интерфейсы.
При инициализации Draggable можно указать массив сенсоров через опцию
sensors:
import { Draggable, Sensors, MouseSensor, TouchSensor } from '@shopify/draggable';
const draggable = new Draggable(document.querySelectorAll('.draggable-item'), {
draggable: '.draggable-item',
sensors: [
MouseSensor,
TouchSensor
]
});
Такой подход позволяет элементам реагировать на события как мыши, так и сенсорного экрана без дополнительной логики.
Комбинированные сенсоры могут генерировать одни и те же события
(drag:start, drag:move,
drag:stop). Чтобы избежать конфликтов, важно использовать
фильтрацию источников событий:
draggable.on('drag:start', (event) => {
if (event.sensorEvent instanceof MouseEvent) {
console.log('Перетаскивание с мыши');
} else if (event.sensorEvent instanceof TouchEvent) {
console.log('Перетаскивание с тачскрина');
}
});
Использование sensorEvent позволяет определить источник
события и корректно обрабатывать логику для разных устройств.
Для реализации специфического поведения можно создавать
пользовательские сенсоры, расширяя базовый класс
Sensor:
import { Sensor } from '@shopify/draggable';
class CustomSensor extends Sensor {
constructor(container, options) {
super(container, options);
this.handleEvent = this.handleEvent.bind(this);
}
attach() {
this.container.addEventListener('pointerdown', this.handleEvent);
}
detach() {
this.container.removeEventListener('pointerdown', this.handleEvent);
}
handleEvent(event) {
this.emit('drag:start', { sensorEvent: event });
}
}
Такой сенсор можно добавить в массив sensors при
инициализации Draggable. Это позволяет комбинировать стандартные сенсоры
и пользовательские, обеспечивая гибкость интерфейса.
sensors влияет на обработку событий. Первый сенсор получает
событие первым, остальные могут его игнорировать.event.preventDefault(), что влияет на работу остальных
сенсоров. Рекомендуется проверять, какие события блокируются.clientX и
clientY из sensorEvent обеспечивает единый
источник данных.Plugins.SwapAnimation и
Plugins.SortAnimation.import { Draggable, MouseSensor, TouchSensor, SwappableSensor } from '@shopify/draggable';
const draggable = new Draggable(document.querySelectorAll('.item'), {
draggable: '.item',
sensors: [
MouseSensor,
TouchSensor,
SwappableSensor
]
});
draggable.on('drag:stop', (event) => {
console.log(`Элемент перемещён: ${event.source.textContent}`);
});
В этом примере элементы одновременно реагируют на мышь, сенсорный
экран и могут обмениваться позициями между контейнерами благодаря
SwappableSensor.
attach и detach, чтобы избежать утечек
событий.Комбинирование сенсоров в Shopify Draggable открывает возможности для создания сложных, отзывчивых интерфейсов, обеспечивая поддержку различных устройств и сценариев взаимодействия.