Как замедлить / отменить обработку событий с помощью ловушек реагирования?
Обработчик события прокрутки будет срабатывать часто. Как это можно замедлить / отменить? И если это возможно, я хочу, чтобы последнее событие всегда было запущено, а не пропущено.
const handleScroll = event => {
//how to debounse scroll change?
//if you will just setValue here, it's will lag as hell on scroll
}
useEffect(() => {
window.addEventListener('scroll', handleScroll)
return () => {
window.removeEventListener('scroll', handleScroll)
}
}, [])
Вот пример использования ловушки для отказов от xnimorz
import { useState, useEffect } from 'react'
export const useDebounce = (value, delay) => {
const [debouncedValue, setDebouncedValue] = useState(value)
useEffect(
() => {
const handler = setTimeout(() => {
setDebouncedValue(value)
}, delay)
return () => {
clearTimeout(handler)
}
},
[value, delay]
)
return debouncedValue
}
2 ответа
Обработчик событий, использующий перехватчики, может быть обработан так же, как и любая другая функция с любой реализацией debounce, например, Lodash:
const updateValue = _.debounce(val => {
setState(val);
}, 100);
const handleScroll = event => {
// process event object if needed
updateValue(...);
}
Обратите внимание, что из-за того, как работают синтетические события React, event
Объект должен обрабатываться синхронно, если он используется в обработчике событий.
последнее событие всегда будет запущено и не пропущено
Ожидается, что только последний вызов будет учтен в дебагированной функции, если реализация не позволяет изменить это, например leading
а также trailing
варианты в Лодашdebounce
,
const debounceLoadData = useCallback(debounce((debounceValue)=>{
props.setSenderAddress(debounceValue)
}, 300), []);