Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/426.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript React.useEffect中的事件侦听器即使在删除后仍能工作_Javascript_Reactjs_React Hooks_Dom Events - Fatal编程技术网

Javascript React.useEffect中的事件侦听器即使在删除后仍能工作

Javascript React.useEffect中的事件侦听器即使在删除后仍能工作,javascript,reactjs,react-hooks,dom-events,Javascript,Reactjs,React Hooks,Dom Events,我理解React建议在每次更新应用程序时添加和删除事件监听器,但是,我意识到即使删除了事件监听器,下面的代码仍然有效(至少在我的理解中): 函数应用程序(){ const[posY,setPosY]=useState(0); useffect(()=>{ constHandleScroll=(e)=>window.requestAnimationFrame(()=>{ setPosY(window.pageYOffset); }); window.addEventListener(“滚动”,ha

我理解React建议在每次更新应用程序时添加和删除事件监听器,但是,我意识到即使删除了事件监听器,下面的代码仍然有效(至少在我的理解中):

函数应用程序(){
const[posY,setPosY]=useState(0);
useffect(()=>{
constHandleScroll=(e)=>window.requestAnimationFrame(()=>{
setPosY(window.pageYOffset);
});
window.addEventListener(“滚动”,handleScroll);
return()=>window.removeEventListener(“滚动”,handleScroll);
}, []);
返回{posY};
}
有人能帮我理解为什么它仍然听滚动事件吗?我认为它不会起作用,因为:

  • 事件侦听器已被这一行删除,
    return()=>window.removeEventListener(“scroll”,handleScroll)
  • “代码>使用效果< /COD>钩子在一开始只运行一次,因为空白数组
  • setPosY(window.pageYOffset)
    调用新的更新/渲染,下一次
    App()
    更新将跳过
    useffect

以上三种说法正确吗?似乎我不完全明白这里发生了什么。

卸载组件时,而不是运行组件时,
useffect
return
。@ShmiliBreuer Ohhh我明白了。谢谢你的意见!那么我还有一个问题。如果
App()?如果不推荐,是因为它是反模式还是这样做有任何潜在的问题?我不能说关于
反模式
,因为我不知道,但是我最近在我开发的一个网站上这样做时遇到了一个问题,需要知道整个页面滚动位置来设置标题的背景色,问题在于,这会导致整个应用程序在每个滚动条上重新渲染,并且除了很重之外,还会导致在每次重新渲染时调用子组件中的
useffect
(调用API)-:,因此,我将事件侦听器移到了标题组件,尽管它也一直保留在页面上,但它是一个较小且不太复杂的组件,因此重新呈现不会太重。@ShmiliBreuer感谢您的输入。如需更多详细信息,请参阅和。