在React Hooks文档中,演示了如何在组件的清理阶段移除VentListener.https://reactjs.org/docs/hooks-reference.html#conditionally-firing-an-effect

在我的用例中,我试图将VentListener条件删除为功能组件的状态属性.

下面是一个从未卸载组件但应移除事件侦听器的示例:

function App () {
  const [collapsed, setCollapsed] = React.useState(true);

  React.useEffect(
    () => {
      if (collapsed) {
        window.removeEventListener('keyup', handleKeyUp); // Not the same "handleKeyUp" :(
      } else {
        window.addEventListener('keyup', handleKeyUp);
      }
    },
    [collapsed]
  );

  function handleKeyUp(event) {
    console.log(event.key);
    switch (event.key) {
      case 'Escape':
        setCollapsed(true);
        break;
    }
  }

  return collapsed ? (
    <a href="javascript:;" onClick={()=>setCollapsed(false)}>Search</a>
  ) : (
    <span>
      <input placeholder="Search" autoFocus />&nbsp;
      <a href="javascript:;">This</a>&nbsp;
      <a href="javascript:;">That</a>&nbsp;
      <input placeholder="Refinement" />
    </span>
  );
}
ReactDOM.render(<App />, document.body.appendChild(document.createElement('div')));

(https://codepen.io/caqu/pen/xBeBMN岁时的活体样本)

我看到的问题是,removeEventListener中的handleKeyUp引用在每次组件渲染时都会发生变化.函数handleKeyUp需要引用setCollapsed,因此必须用App括起来.在useEffect中移动handleKeyUp似乎也会多次开火,并失go 对原来handleKeyUp的参考.

我怎样才能有条件地打开窗口.在不卸载组件的情况下使用React钩子移除VentListener?

推荐答案

您可以将handleKeyUp函数放在给定给useEffect(which is the recommended way of doing it according to the official documentation)的函数中,并且仅在collapsed为false时添加侦听器并返回清理函数.

useEffect(() => {
  if (collapsed) {
    return;
  }

  function handleKeyUp(event) {
    switch (event.key) {
      case "Escape":
        setCollapsed(true);
        break;
    }
  }

  window.addEventListener("keyup", handleKeyUp);
  return () => window.removeEventListener("keyup", handleKeyUp);
}, [collapsed]);

Reactjs相关问答推荐

404使用GitHub操作部署Next.js应用程序时出错

是否将样式应用于父悬停(框架运动)上的子元素?

从Microsoft Excel粘贴复制的单元格时,将Excel单元格格式(粗体、下划线、斜体)带入Reaction

在Reaction中管理多个状态

页面永远加载API/从数据库获取数据

如何使我的代码可以接受我想要的每一个链接

使用 MUI 菜单时添加新 html 元素时布局意外滚动跳转

如何测试根据 prop 更改 CSS 属性的 useEffect 钩子?

Symfony ux-react:使用react_component()时React组件不会渲染

从 redux 调用UPDATE_DATA操作时状态变得未定义

ReactJS 中的图像加载顺序

在 React-Select 中显示多值的倒序

使用 nextjs App Router 在动态客户端进行服务器端渲染

FlatList 不在 React Native 中呈现项目

位于组件material-ui中的TextField中的 map 功能不起作用

加密 Django Rest Framework API 响应 + 解密响应应用程序中的响应

哪个是创建 React 应用程序的更好方法?

如何根据react 中的 map 功能一次只打开一个弹出窗口?

将 dict 值转换并插入到react 钩子的列表中

将 set statehook 函数传递给子路由组件.解构错误