Часть 1. Обработчик событий регулирования
Ваша первая проблема вызвана тем, как вы используете _.throttle()
, в идеале она должна быть обернута вокруг вашего обратного вызова обработчика событий.
Пожалуйста, просмотрите примеры в lodash.throttle() docs
для справки по использованию.
Также взгляните на этот вопрос SO , он может предложить вам некоторые более глубокое понимание использования газа в React Hooks.
Главное изменение заключалось в том, чтобы обернуть обратный вызов события throttle
.
const throttledSetPosition = throttle(event => {
if (event.touches[0].clientY) {
if (slider.current.contains(event.target)) {
setTouchPosition(Math.round(event.touches[0].clientY));
}
} else {
setTouchPosition(null);
}
}, 200);
const handleTouchMove = useCallback(throttledSetPosition, [touchPosition]);
Часть 2 - Увеличение / Уменьшение значения
Чтобы достичь цели увеличения / уменьшения отображаемого значения, сначала нужно определить масштаб. Какое максимальное количество минут вы хотите отобразить? Давайте использовать 100
, поскольку это легко понять.
То, что вам затем нужно вычислить, это процент от 100
, к которому пользователь в данный момент касается, но обратный (поскольку ближе к вершине действительно ближе к 100
, а дальше вниз ближе к 0
).
Для этого вы можете использовать следующее:
// Define the scale
const scale = 100;
// Extract needed variables from event touches array
const {
clientY,
target: { offsetHeight, offsetTop }
} = event.touches[0];
// Calculate the percentage
const percentage = (clientY - offsetTop) / offsetHeight;
// Make the calculation to be reversed by subtracting the percentage from the scale...
const currentValue = scale - (percentage * scale);
// Set the display value
setTouchPosition(Math.round(currentValue));
Я разбудил вашу песочницу здесь с вышеуказанными изменениями.