【发布时间】:2021-03-26 05:50:14
【问题描述】:
如果用户滚动到顶部,我会尝试将 onTop 状态设置为 true,否则设置为 false。我尝试了以下方法。
function Test()
{
const [ onTop, setOnTop ] = useState( true )
const watchScroll = () =>
{
if ( window.scrollY < 100 ) setOnTop( true )
else setOnTop( false )
}
useEffect(() => {
window.addEventListener(`scroll`, watchScroll )
return window.removeEventListener(`scroll`, watchScroll )
}, [ watchScroll ])
return (
<div>{ onTop ? `On Top` : `Not On top` }</div>
)
}
上面的例子不起作用,但也没有抛出错误。
function Test()
{
const [ onTop, setOnTop ] = useState( true )
const watchScroll = () =>
{
if ( window.scrollY < 100 ) setOnTop( true )
else setOnTop( false )
}
useEffect(() => {
window.addEventListener(`scroll`, () => watchScroll() )
return window.removeEventListener(`scroll`, () => watchScroll() )
}, [ watchScroll ])
return (
<div>{ onTop ? `On Top` : `Not On top` }</div>
)
}
请注意,我在第二个参数函数中添加了一个箭头和大括号。上面的示例按预期工作。谁能解释为什么?非常感谢!
【问题讨论】:
-
内联函数对 removeEventListener 不起作用。
-
您也可以传递函数引用。
window.addEventListener("scroll", watchScroll);两者都有效
标签: javascript reactjs addeventlistener use-effect