【发布时间】:2021-07-18 16:54:09
【问题描述】:
我尝试将我的组件从 react.component 重构为钩子,但我遇到了一些麻烦。我真的不明白如何使用我的状态offsetTop。该值已设置,或在我需要时设置。
第一次尝试:
const [offsetTop, setOffsetTop] = useState();
useEffect(() => {
setOffsetTop(window.pageYOffset + document.querySelector(".projectsContainer").getBoundingClientRect().top)
console.log(offsetTop);
window.addEventListener('scroll', handleScroll, true)
return () => window.removeEventListener("scroll", handleScroll);
}, []);
我还尝试将它与useEffect 和[offsetTop] 作为第二个参数的第二种方法一起使用,但我的日志显示了两次 undef 和值。我明白为什么它显示两次,但仍然没有解决我的问题,我的情况不起作用。
第二次尝试:
const [offsetTop, setOffsetTop] = useState();
useEffect(() => {
setOffsetTop(window.pageYOffset + document.querySelector(".projectsContainer").getBoundingClientRect().top)
}, []);
useEffect(() => {
console.log(offsetTop);
window.addEventListener('scroll', handleScroll, true)
return () => window.removeEventListener("scroll", handleScroll);
}, [offsetTop]);
handleScroll 功能:
function handleScroll() {
console.log(offsetTop);
const scrolledY = window.scrollY
if (scrolledY > offsetTop) console.log("works")
}
与放在componentDidMount() {} 中的First try: 相同的代码并使用this 可以正常工作。所以不好的不是条件。这是关于何时设置值以及useState 和useEffect 的工作原理。
【问题讨论】:
-
你确定
.projectsContainer在useEffect运行时可以被查询吗?为了确保它是你可以尝试useLayoutEffect代替,它在所有 DOM 突变后同步运行
标签: javascript reactjs react-hooks next.js