如何克服无法读取反应中 null 的属性“removeEventListener”

2024-02-13

我有一些重复的悬停状态,运行一个函数来显示一些空或填充的图标(就像您在一些带有空/填充购物车的电子商务网站中看到的那样)。作为实践,我想创建并将其放入自定义的hoverHooks组件中,w/useRef and useEffect运行一些add/remove事件监听器,就像这样:

const ref = useRef(null)
function enter() {
  setHover(true)
}
function leave() {
  setHover(false)
}

useEffect(() => {
  ref.current.addEventListener('mouseenter',enter)
  ref.current.addEventListener('mouseleave', leave)
 return () => {
   ref.current.removeEventListener('mouseenter',enter)
   ref.current.removeEventListener('mouseleave',leave)
}
})

我这样做是为了让保存我的图标的容器可以有ref={ref}无需我反复书写onMouseEnter / onMouseLeave。 (我猜我的参考文献正在重复,但最好是三个字母,然后移动我的悬停state只到一个地方。 无法读取属性'removeEventListener' of null,就是我得到的。我在“潜在问题”下阅读了有关此问题的 React 17 文档。但他们的建议不起作用(通过将可变数据存储到变量中来捕获可变数据)。

useEffect(() => {
  const myRef = ref.current

  myRef.current.addEventListener('mouseenter',enter)
  myRef.current.addEventListener('mouseleave', leave)
 return () => {
   myRef.current.removeEventListener('mouseenter',enter)
   myRef.current.removeEventListener('mouseleave',leave)
}
})

任何和所有的建议将不胜感激! 谢谢


这就是您要找的吗?

/* HOVER HOOK */

const useHover = ({ ref, onMouseEnter, onMouseLeave }) => {

React.useEffect(() => {
  if (ref.current) {
    ref.current.addEventListener('mouseenter',onMouseEnter);
    ref.current.addEventListener('mouseleave',onMouseLeave);
  }
  return () => {
    ref.current.removeEventListener('mouseenter',onMouseEnter);
    ref.current.removeEventListener('mouseleave',onMouseLeave);
  };
},[ref,onMouseEnter,onMouseLeave]);
  
  return;

};

/* APP */

function App() {

  const ref = React.useRef(null);
  
  const onMouseEnter = () => console.log("ENTER");
  const onMouseLeave = () => console.log("LEAVE");
  
  useHover({ref,onMouseEnter,onMouseLeave});
  

  return(
    <div className="app" ref={ref}>
      Hover me
    </div>
  );
}

ReactDOM.render(<App/>, document.getElementById("root"));
.app {
  width: 100px;
  height: 100px;
  display: flex;
  align-items: center;
  justify-content: center;
  border: 1px solid blue;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.8.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.8.3/umd/react-dom.production.min.js"></script>
<div id="root"/>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何克服无法读取反应中 null 的属性“removeEventListener” 的相关文章

随机推荐

  • 对非 PHP 文件使用 Laravel @include 指令?

    我一直在寻找一种使用带有非 PHP 文件扩展名的 Laravels Blade 模板引擎 而不是file name blade php能够使用file name blade js or file name blade css 无济于事 我找
  • 1and1 域名、Heroku 托管 - 如何设置电子邮件?

    我刚刚从 1and1 购买了一个域名 并将 cname 设置为指向我在 heroku 上的应用程序 不过 我想要一个电子邮件 电子邮件受保护 cdn cgi l email protection 我需要通过 1and1 或 heroku 执
  • OCR 处理前的图像预处理

    我当前的项目涉及将 pdf 中的文本转录为文本文件 我首先尝试将图像文件直接放入 OCR 程序 tesseract 中 但效果不佳 原始图像文件基本上是旧报纸 并且有一些背景噪音 我确信 tesseract 存在问题 因此 我尝试在将图像输
  • Python 为什么是 10e26 != 10**26 ? (浮点不准确?)

    我试图在 python 中处理一些相当大的数字并遇到溢出错误 我决定进一步调查 发现了一个我无法解释的不平等现象 当我评估 10 26 时 我得到 gt gt gt 10 26 100000000000000000000000000 这是完
  • iOS:应用程序后台运行时隐藏屏幕上的敏感信息

    当前台应用程序进入后台时 例如按下主页按钮 如何更改最顶层视图控制器上的元素prioriOS 何时拍摄快照并开始动画以显示下一个屏幕 我问这个问题是因为我正在编写一个需要符合 HIPAA 要求的应用程序 并且我担心操作系统为执行此动画而拍摄
  • 通过淘汰赛在我的下拉列表中预选一个项目

    我有以下下拉菜单 div Dummy div
  • 将附件添加到 .NET 电子邮件

    如何附加名称非常不友好的文件 例如其中包含会话 ID 号的文件 但将其附加为其他名称 有问题的文件名中包含会话 ID 以避免 Web 服务器上的名称冲突 但当我将其附加到文件时 最好使用更友好的名称 有没有办法将不友好的名称附加为另一个名称
  • 您可以使用 Canvas 截取页面的“屏幕截图”吗?

    我有一个页面 我们使用 CSS 定位一堆元素 并使用 JS 更改它们的 顶部和左侧 位置 我收到的报告称这些事情已经错位 但用户有动机对此撒谎以 作弊 所以我不确定他们是否说的是实话 我试图找到一种方法来弄清楚他们是否在撒谎 并找到一些 证
  • 我可以信任 PHP __destruct() 方法被调用吗?

    在 PHP5 中 是否保证为每个对象实例调用 destruct 方法 程序中的异常可以防止这种情况发生吗 还值得一提的是 如果子类有自己的析构函数 则父类析构函数是not自动调用 你必须明确地调用父级 destruct 来自子类 destr
  • Numpy 数组与其他数组索引会产生广播错误

    我有两个索引数组 elim range 130 240 tlim range 0 610 要索引的数组 I 最初的形状为 299 3800 当我尝试按如下方式对其进行索引时 I elim tlim 我收到以下错误消息 形状不匹配 索引数组无
  • 将复合外键映射到复合主键,其中外键也是主键

    我想将 VM hostname datetime 和 name 属性设置为复合键磁盘类 同时VM hostname和datetime磁盘类应参考 VM hostname 和 datetime虚拟机类 即外键 我这样做了 但它给了我这个例外
  • iOS状态栏触摸返回App

    这让我很困惑 有人知道如何去做吗 蓝色发光状态栏如图所示 就像 Facebook 应用程序在启动 FB Messenger 时所做的那样 抱歉图片太大了 如果有人能指出我正确的方向 那就太好了 它看起来像是一个位于导航栏顶部的自定义视图 带
  • 如何使用单个按钮和单个操作方法显示/隐藏 UIPopoverController

    以下方法与导航栏按钮相关联 当按下该按钮时 会显示一个UIPopoverController IBAction showTablePopUp id sender if self tablesPopoverController nil Tab
  • 使用 Emacs 运行 $PAGER?

    UNIX 中有很多地方程序调用 PAGER 中的程序 通常less或一些类似的命令 来显示一些输出 确实 许多最常见的用途都有 Emacs 替代品 例如man 例如 但我仍然想要使用 Emacs 作为我的系统范围寻呼机的通用方法 理想情况下
  • 理解 MVC:模型上的“Fat”和控制器上的“Skinny”是什么概念?

    我试图理解模型上的 胖 与控制器上的 瘦 的概念 并且根据我一直在讨论的内容 我有以下示例 这取自 freenode 讨论 问 在 MVC 范式中 它说胖模型 瘦控制器 我在这里想 如果我有很多方法 在控制器上 只使用一些抽象方法来 CRU
  • 在 iOS 6.x (iPad) 上使用 JS 选择/取消选择下拉选项

    我正在使用 html 创建动态下拉列表
  • Maven:如何使用包含外部库来执行可运行的 jar (uber jar)

    到目前为止 我用 Ant 制作了可运行的 jar 并且没有任何问题 然而 我现在尝试对我的项目进行mavenize 但我真的不知道如何使用这个工具来制作可运行的jar 我读过大量的教程 也在这里 在 Stackoverflow 上 帮助 建
  • 如何在cocoapods中加载资源resource_bundle

    我一直在努力解决如何在 cocoapods resources bundle 中加载资源 以下是我放入的内容 podspecs file s source files XDCoreLib Pod Classes s resource bun
  • 无法在 IIS Express 中启动 ASP.NET Core Web 应用程序

    编辑 问题出在 BitDefender 防病毒软件上 我按照有关如何安装 asp net 5 beta 8 的说明进行操作 我能够毫无问题地安装所有必需的文件 然而 每次我选择 Web 模板并尝试使用 IIS Express 运行它时 它都
  • 如何克服无法读取反应中 null 的属性“removeEventListener”

    我有一些重复的悬停状态 运行一个函数来显示一些空或填充的图标 就像您在一些带有空 填充购物车的电子商务网站中看到的那样 作为实践 我想创建并将其放入自定义的hoverHooks组件中 w useRef and useEffect运行一些ad