使用Reactjs获取滚动位置

时间:2018-11-05 16:53:30

标签: javascript reactjs

我使用reactjs,并希望通过click事件处理滚动。

首先,我用componentDidMount呈现了帖子列表。

其次,在列表中的每个帖子上按click event,它将显示帖子详细信息并滚动到顶部(因为我将帖子详细信息置于页面的顶部位置)。

第三,通过在帖子详细信息中单击"close button",它将返回以前的帖子列表,但是我希望网站将滚动到要单击的帖子的位置。

我这样使用:

单击事件以查看帖子详细信息:

inSingle = (post, e) => {
   this.setState({
        post: post,
        theposition: //How to get it here?
   });
   window.scrollTo(0, 0);
}

我想获得theposition的状态,然后可以确实滚动到'Close event'所点击帖子的位置。

非常感谢。

7 个答案:

答案 0 :(得分:13)

如果需要跟踪滚动位置,可以使用react钩子这样做,这样就可以在需要时随时检查滚动位置:

import React, { useState, useEffect } from 'react';

...
// inside component:

const [scrollPosition, setScrollPosition] = useState(0);
const handleScroll = () => {
    const position = window.pageYOffset;
    setScrollPosition(position);
};

useEffect(() => {
    window.addEventListener('scroll', handleScroll, { passive: true });

    return () => {
        window.removeEventListener('scroll', handleScroll);
    };
}, []);

在这种情况下,useEffect的行为类似于componentDidMount,它将在组件渲染后触发,而且在每个渲染中都会触发,正如Jared Beach评论如下:“ window.addEventListener足够聪明,可以丢弃具有相同参数的后续调用”。 。确保返回清理功能,类似于您在componentWillUnmount中所做的操作。

答案 1 :(得分:9)

您可以像在其他js框架或库中一样在事件中使用事件侦听器。

componentDidMount() {
  window.addEventListener('scroll', this.listenToScroll)
}

componentWillUnmount() {
  window.removeEventListener('scroll', this.listenToScroll)
}

listenToScroll = () => {
  const winScroll =
    document.body.scrollTop || document.documentElement.scrollTop

  const height =
    document.documentElement.scrollHeight -
    document.documentElement.clientHeight

  const scrolled = winScroll / height

  this.setState({
    theposition: scrolled,
  })
}

答案 2 :(得分:7)

这应该有效:

this.setState({
    post: post,
    theposition: window.pageYOffset
});

答案 3 :(得分:5)

import React, { useLayoutEffect, useState } from 'react';

export default function useWindowPosition() {
  const [scrollPosition, setPosition] = useState(0);
  useLayoutEffect(() => {
    function updatePosition() {
      setPosition(window.pageYOffset);
    }
    window.addEventListener('scroll', updatePosition);
    updatePosition();
    return () => window.removeEventListener('scroll', updatePosition);
  }, []);
  return scrollPosition;
}

答案 4 :(得分:1)

赞:

theposition: e.y // or, e.pageY

或者,

theposition: e.clientY - e.currentTarget.getBoundingClientRect().top

答案 5 :(得分:1)

要获取当前滚动位置,可以使用

水平滚动量 window.pageXOffset

垂直滚动量 window.pageYOffset

答案 6 :(得分:0)

此存储库对我有很大帮助https://github.com/n8tb1t/use-scroll-position

yarn add @n8tb1t/use-scroll-position

import { useScrollPosition } from '@n8tb1t/use-scroll-position'


useScrollPosition(({ prevPos, currPos }) => {
 console.log(currPos.x)
 console.log(currPos.y)
})