使用 react-spring 动画 scrollTop

Animating scrollTop using react-spring

这应该很简单,但我想我遗漏了一些关于 Spring 工作原理的重要信息,文档帮助不大。

我有一个动态列表,用户可以添加元素,当发生这种情况时,我想使用 React Spring 为滚动到页面底部设置动画(由 currentBottomY 变量标识)

我有这样的东西

const mainRef = useRef<HTMLElement | null>(null)

const [y, setY] = useSpring({
    from: { y: mainRef?.current?.scrollTop || 0 },
    onFrame: props => {
       mainRef.current.scrollTop = props.y
    },
})

const onAddRow = () => {
    setY({ y: currentBottomY })
}

return (
    <animated.div ref={mainRef}>
        <List />
    </animated.div>
)

我收到错误消息说我无法在其中定义 fromonFrame 但在文档中它另有说明,我真的无法在这方面取得成功,有什么帮助吗?

如果你想在以后的调用中控制更新,(这似乎是你做的),尝试传递给 useSpring hook 函数。

const [y, setY] = useSpring(() => ({
  from: { y: mainRef?.current?.scrollTop || 0 },
  onFrame: props => {
     mainRef.current.scrollTop = props.y
  },
}));

感谢 Matt 的指点,我解决了这个问题并创建了一个可重用的钩子,它接受容器的 ref 并在调用 scrollToBottom() 函数时滚动到底部。

import { useSpring } from 'react-spring'

const useScrollAnimation = (
  containerRef: React.MutableRefObject<HTMLDivElement | null>
): { animate: () => void } => {
  const [, setY] = useSpring(() => ({
    y: 0,
    onFrame: (props: any) => {
      props
    },
  }))

  const scrollToBottom = () => {
    setTimeout(() => {
      const current = containerRef?.current
      if (current) {
        const { scrollHeight } = current
        setY({
          config: { duration: 200 },
          y: scrollHeight - current.getBoundingClientRect().bottom,
          onFrame: (props: any) => (current.scrollTop = props.y),
        })
      }
    }, 0)
  }

  return { scrollToBottom }
}

export default useScrollAnimation