Как замедлить / отменить обработку событий с помощью ловушек реагирования?

Обработчик события прокрутки будет срабатывать часто. Как это можно замедлить / отменить? И если это возможно, я хочу, чтобы последнее событие всегда было запущено, а не пропущено.

  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), []);
Другие вопросы по тегам