Лучшая практика реагирования на функции onWheel/onScroll?

#css #reactjs #scroll #vertical-scrolling

Вопрос:

Итак, у меня есть сложная анимация, которую я хочу сделать на колесе с помощью React. По сути, когда пользователь сначала прокручивает страницу, она сначала уменьшается, чтобы показать, что я редактирую страницу на мониторе. Затем, как только он достигнет своей полной ширины, он позволит пользователю снова прокрутить страницу вниз. Когда вы прокручиваете назад, он снова увеличивается. Так что пока все в порядке, я сделал все, о чем упоминал, с одной уловкой:

Когда вы сначала пытаетесь уменьшить масштаб, предположим, что вы вообще не перемещаете мышь во время прокрутки и что ваша прокрутка достаточно быстрая, чтобы вы не прекращали прокрутку очень долго, чтобы переместить палец на колесе прокрутки. По какой-то причине он просто сидит на месте и не прокручивается, пока вы не переместите мышь или не подождете десятую долю секунды или дольше.

Поэтому в настоящее время я выполняю все это, используя комбинацию onScroll и onWheel. Я использую onScroll, чтобы посмотреть, вернулись ли мы в верхнюю часть страницы, чтобы он знал, запускать ли анимацию прокрутки и прокрутки или прокручивать нормально. Если он находится в верхней части страницы и все еще увеличен, переполнение скрыто, в противном случае это переполнение: прокрутка.

Вот мой код:

   const [scrolledOut, setScrolledOut] = React.useState(false)
  const [scrollTop, setScrollTop] = React.useState(0)
  const [scale, setScale] = React.useState(1)

  const { height, width } = useWindowDimensions();

  function checkLocking(n) {
    if(n < 0.36 || scrollTop > 0) {
      setScrolledOut(true)
    } else {
      setScrolledOut(false)
    }
  }

  const handleWheel = (e) => {
    if(width <= 991) {
      return null
    }
    let scrollAmount = e.deltaY
    if(scrollAmount > 0 amp;amp; scale > 0.35 amp;amp; !(scrollTop > 0)) {
      const newScale = parseFloat(scale) - 0.05
      setScale(parseFloat(newScale).toFixed(2))
      checkLocking(newScale)

      return null
    } else if(scrollAmount < 0 amp;amp; scale < 1 amp;amp; !(scrollTop > 0)) {
      const newScale = parseFloat(scale)   0.05
      setScale(parseFloat(newScale).toFixed(2))
      checkLocking(newScale)

      return null
    }

    return null
  }

  const handleScroll = (e) => {
    let element = e.target;
    setScrollTop(element.scrollTop)
  }
 

Это заблокирует или разблокирует этот элемент с помощью троичного оператора:

 <div className="App" onScroll={(e) => handleScroll(e)} onWheel={(e) => handleWheel(e)} className={scrolledOut ? "App unlocked" : "App locked" } data-theme="dark">
 

Есть также несколько кнопок, которые автоматически уменьшают масштаб, а затем прокручивают, но это не имеет значения. Так что мой вопрос действительно сводится к тому, правильно ли я это делаю? Мог бы я сделать это лучше? Если я все делаю правильно, как мне исправить проблему с прокруткой?

Комментарии:

1. Производительность вашего приложения пострадает, если вы используете состояние для обработки прокрутки, в этих сценариях, я думаю, вам лучше использовать или ограничить его с помощью requestAnimationFrame

2. @KadirDamene Это полезное предложение. Не могли бы вы привести мне пример с моим кодом того, как вы это сделаете?