问题描述
我正在使用React JS库跟踪用户的滚动高度并根据接收到的数据应用功能。
它在Codesandbox.io上可以正常工作,但是一旦我在npm localhost上运行它,即使我使用的是完全相同的代码,它也不存在。
这是我要在localhost上应用的函数,但始终返回0:
//Scroll event listener to change menu background color
const ScrollingElement = () => {
const [scrollY,setScrollY] = useState(0);
function logit() {
setScrollY(window.pageYOffset);
}
useEffect(() => {
function watchScroll() {
window.addEventListener("scroll",logit);
}
watchScroll();
// Remove listener (like componentwillUnmount)
return () => {
window.removeEventListener("scroll",logit);
};
},[]);
console.log(scrollY);
return scrollY;
}
我试图调试scrollY
变量,在localhost上无论如何我总是收到0值。
我猜这是codesandBox.io有的定义错误,我没有。
还尝试对App函数进行以下调试,并返回0:
function App() {
console.log(ScrollingElement());
return (
<div>
<Menu scrollHeight={ScrollingElement()}></Menu>
<Home></Home>
</div>
);
}
如何在可在codeandBox中运行的localhost上运行代码?
解决方法
您的<ScrollingElement />
在工作,但是您需要确保父组件实际上是可滚动的。最简单的解决方案是创建新的<Wrapper />
组件并使用CSS设置其高度。
function Wrapper() {
return (
<div style={{height: "200vh"}}>
<ScrollingElement />
</div>
);
}
可运行的示例:
const {useState,useEffect} = React;
function Wrapper() {
return (
<div style={{height: "200vh",backgroundColor: "beige"}}>
<ScrollingElement />
</div>
);
}
const ScrollingElement = () => {
const [scrollY,setScrollY] = useState(0);
function logit() {
setScrollY(window.pageYOffset);
}
useEffect(() => {
function watchScroll() {
window.addEventListener("scroll",logit);
}
watchScroll();
return () => {
window.removeEventListener("scroll",logit);
};
},[]);
console.log(scrollY);
return scrollY;
}
ReactDOM.render(<Wrapper/>,document.getElementById("root"));
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.13.1/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.13.1/umd/react-dom.production.min.js"></script>
<div id="root"></div>