В Solid.js, как и в других современных JavaScript-фреймворках, взаимодействие с пользователем через сенсорные события является важной частью построения интерактивных интерфейсов. Работа с сенсорными событиями может включать не только базовое определение касания, но и обработку жестов, плавных анимаций и других интеракций, которые могут быть полезны в мобильных и планшетных приложениях.
Сенсорные события в Solid.js тесно связаны с нативными событиями
браузера. Они включают в себя стандартные события типа
touchstart, touchmove, touchend и
touchcancel, которые определяют момент начала, перемещения,
завершения касания и его отмены соответственно.
Каждое из этих событий предоставляет объект, содержащий информацию о
самом касании и координатах на экране. В отличие от мышиных событий,
которые обрабатываются с использованием объекта MouseEvent,
для сенсорных событий используется объект TouchEvent. Этот
объект имеет свойство touches, представляющее собой список
всех касаний, активных в момент события.
Пример обработки события touchstart:
import { createSignal } from 'solid-js';
function TouchComponent() {
const [touchStart, setTouchStart] = createSignal(null);
const handleTouchStart = (event) => {
const touch = event.touches[0]; // Первое касание
setTouchStart({ x: touch.clientX, y: touch.clientY });
};
return (
<div
onTouchSt art={handleTouchStart}
style={{ width: '100%', height: '100vh', backgroundColor: 'lightblue' }}
>
{touchStart() ? `Touch started at: ${touchStart().x}, ${touchStart().y}` : 'Touch the screen'}
</div>
);
}
mousedown в мышиных
событиях.mouseup в мышиных
событиях.Пример использования всех типов событий:
import { createSignal } from 'solid-js';
function TouchEventsComponent() {
const [message, setMessage] = createSignal('Start touching the screen');
const handleTouchStart = () => setMessage('Touch started');
const handleTouchMove = () => setMessage('Touch moving');
const handleTouchEnd = () => setMessage('Touch ended');
const handleTouchCancel = () => setMessage('Touch cancelled');
return (
<div
onTouchSt art={handleTouchStart}
onTouchM ove={handleTouchMove}
onTouch End={handleTouchEnd}
onTouchCan cel={handleTouchCancel}
style={{ width: '100%', height: '100vh', backgroundColor: 'lightgray' }}
>
{message()}
</div>
);
}
Одной из особенностей сенсорных событий является возможность работать с несколькими одновременными касаниями. Например, можно обработать ситуации, когда два пальца касаются экрана одновременно, и это используется для жестов, таких как масштабирование (пинч).
Объект TouchEvent содержит массивы touches,
targetTouches и changedTouches, каждый из
которых имеет разные особенности.
Пример с двумя касаниями:
import { createSignal } from 'solid-js';
function MultiTouchComponent() {
const [touchCount, setTouchCount] = createSignal(0);
const handleTouchStart = (event) => {
setTouchCount(event.touches.length);
};
const handleTouchEnd = (event) => {
setTouchCount(event.touches.length);
};
return (
<div
onTouchSt art={handleTouchStart}
onTouch End={handleTouchEnd}
style={{ width: '100%', height: '100vh', backgroundColor: 'lightgreen' }}
>
{touchCount() > 1 ? `Multiple touches detected: ${touchCount()}` : 'Single touch detected'}
</div>
);
}
Для реализации специфического поведения при касаниях, например, при
свайпах или жестах, может возникнуть необходимость предотвратить
стандартное поведение браузера, такое как прокрутка страницы. В этом
случае следует использовать метод preventDefault на объекте
события.
const handleTouchMove = (event) => {
event.preventDefault(); // Останавливает прокрутку страницы
// Добавьте здесь обработку движения
};
При этом стоит помнить, что блокировка прокрутки может быть нарушением пользовательского опыта, если она не обоснована.
Работа с событиями касания может быть производительной задачей, особенно если нужно обработать множество движений или жестов в реальном времени. Для этого в Solid.js используется реактивная модель, что позволяет эффективно обновлять интерфейс только в случае необходимости.
Для оптимизации можно использовать такие подходы, как:
Пример использования throttling с использованием
setTimeout:
import { createSignal } from 'solid-js';
function ThrottledTouchComponent() {
const [touchPosition, setTouchPosition] = createSignal(null);
let timeoutId;
const handleTouchMove = (event) => {
if (timeoutId) clearTimeout(timeoutId);
timeoutId = setTimeout(() => {
const touch = event.touches[0];
setTouchPosition({ x: touch.clientX, y: touch.clientY });
}, 100); // Обработка события каждые 100 мс
};
return (
<div
onTouchM ove={handleTouchMove}
style={{ width: '100%', height: '100vh', backgroundColor: 'lightyellow' }}
>
{touchPosition() ? `Touch at: ${touchPosition().x}, ${touchPosition().y}` : 'Move your finger'}
</div>
);
}
Работа с touch-событиями в Solid.js позволяет создавать динамичные, отзывчивые и мобильные интерфейсы, учитывающие особенности взаимодействия пользователей с сенсорными экранами. Обработка касаний и жестов с использованием реакции на события дает разработчику гибкость в создании сложных интерактивных интерфейсов с минимальными затратами на производительность.