我使用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'
所点击帖子的位置。
非常感谢。
答案 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)
})