Движение фреймера не обновляет scrollYProgress

#css #reactjs #framer-motion

#css #reactjs #фреймер-движение

Вопрос:

Я использую хук Framer Motion useViewportScroll для отслеживания прокрутки пользователя на моей странице, но он не обновляется. Я наткнулся на эту статью, в которой объясняется, как Framer Motion использует document.body.clientHeight и window.innerHeight для вычисления прокрутки области просмотра.

В статье объясняется, как некоторые CSS могут нарушить это, в частности, если document.body.clientHeight - window.innerHeight <= 0 .

Кажется, я не могу понять, как это может быть неправдой. Даже при полном отсутствии CSS в моем приложении react это выражение оценивается как true . Вы можете увидеть это в этом примере на CodeSandbox.

Спасибо!

Ответ №1:

Я думаю, причина, по которой вы не видите обновлений, заключается не в каком-либо css.
Framer, похоже, вычисляет его состояние автономно от react. Поэтому, когда Framer обновляет свои значения внутренне. реакция не обязательно вызовет повторный рендеринг с обновленными значениями. (вероятно, это делается для повышения производительности).

Вы можете подключиться к изменениям состояния, подписавшись на onChange обработчик, который предоставляет Framer, и установить интересующее вас состояние.

Например, onChange вызов on scrollYProgress вызовет setState react для повторного рендеринга.

 import React from "react";
import { useViewportScroll } from "framer-motion"

const FramerPostionHook = () => {
  const { scrollYProgress } = useViewportScroll();
  const [hookedYPostion, setHookedYPosition] = React.useState(0);
  React.useEffect(()=>{
    // hook into the onChange, store the current value as state.
    scrollYProgress.onChange(v=> setHookedYPosition(v));
  },[scrollYProgress]); //make sure to re-subscriobe when scrollYProgress changes

  return  (<>
  scrollYProgress.current: {scrollYProgress.current}<br/>
  scrollYProgress.hookedYPostion: {hookedYPostion}<br/>
  </>)
}
 

Пример песочницы

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

1. Удивительно, это то, что я искал!

2. Я просто люблю тебя