tl;dr

Вот ссылка на пакет npm и на демонстрационный сайт

Моя мотивация

В последнее время я работал над этим мобильным приложением с помощью cordova 😥
Это один из худших проектов, над которыми я работал. Но иногда вы можете найти замаскированное благословение 🙄. Из-за боли, связанной с этим проектом, с использованием новой версии react и хуками, которые заняли свое место в качестве законного шаблона, я решил попробовать и создать собственный хук для обработки мобильных жестов.

Реализация

Мобильные жесты являются результатом события касания.
Теперь в response есть прослушиватель событий для касания таких событий, как onTouchStart, но мне нужно было использовать его более общим способом, а не просто помещать его в отдельный элемент.
Таким образом, я использовал для работы два крючка. useRef и useEffect

Этот хук получает объект ref в результате встроенного хука response useRef.

useRef возвращает изменяемый объект ref, свойство .current которого инициализировано переданным аргументом (initialValue). Возвращенный объект будет сохраняться в течение всего времени жизни компонента - Справочник по API хуков

Используя ловушку useEffect, я присоединяю и отключаю прослушиватели событий касания к указанному элементу.

useEffect Definition немного длиннее, поэтому я пропущу его здесь и просто скажу, что useEffect запускается после каждого рендеринга, и это способ, которым вы прикрепляете свой компонент к внешнему побочному эффекту (отсюда и название), например к общим событиям касания.

Перевод события касания в жесты

Реализованы три типа жестов: панорамирование, смахивание и сжатие.
Сдвиг и смахивание - это простые сенсорные события с небольшой разницей.
Смахивание имеют направление и срабатывают только тогда, когда расстояние касания превышает минимальное значение.
Сжатие - это событие касания двумя пальцами.

Я удалил весь код, о котором говорил, и часть кода, о которой расскажу позже.

Здесь нужно обратить внимание на две вещи

  1. В каждом обработчике событий нам нужно определить, является ли прикосновение событием Pinch (точнее, указателями касания) или нет.
  2. При касании и касании нам нужно проверить, вызвали ли жесты событие смахивания.

Вспомогательные функции

Здесь у нас есть четыре функции помощи

getDistance возвращает расстояние между двумя указателями (касаниями)

getAngleDeg возвращает угол в градусах между указателями.

callHandler Получает имя события и объект события для передачи в функцию прослушивателя обработчика событий и отправляет присоединенную функцию прослушивателя.

getCurrentTouches Отвечает за осмысление исходного события касания и определение нашего настраиваемого объекта события, который мы будем использовать позже.

Пример

Это простой пример использования хука useGestures для поворота изображения.
Вы можете найти этот и другие примеры на этой демонстрационной странице.

Вот и все
Я надеюсь, что этот пост окажется для вас полезным, и я надеюсь, что вы найдете полезным мой пакет useGestures 😀