我们可以使用函数作为 useEffect 中的第二个参数吗

2024-01-02

我有以下功能:

function handleEnterPress(e) {
    if (e.keyCode === 13) {
      if (value !== "") {
        let toAdd = true;
        chips.forEach(chip => {
          if (chip.value === value) {
            toAdd = false;
          }
        });
        if (toAdd) {
          let chipsCopy = [...chips, { value, isDisabled: false }];
          setChips(chipsCopy);
        }
      }
      setValue("");
    }
  }

我有以下useEffect:

useEffect(() => {
    inputRef.current.addEventListener("keyup", handleEnterPress);
    return () =>
      inputRef.current.removeEventListener("keyup", handleEnterPress);
  }, [value]);

现在反应给了我一个警告:

React Hook useEffect 缺少依赖项“handleEnterPress”。

当我们添加时会有什么区别handleEnterPress在第二个参数数组中?


当我们在第二个参数数组中添加handleEnterPress 时,会有什么不同。

为你?更干净的代码,没有警告。
对于反应?就是它的工作方式useEffect.

要删除此警告,您需要添加handleEnterPress到的依赖数组useEEfect

useEffect(() => {
    inputRef.current.addEventListener("keyup", handleEnterPress);
    return () =>
      inputRef.current.removeEventListener("keyup", handleEnterPress);
  }, [value, handleEnterPress]);

你之所以需要这个,是因为反应不知道什么handleEnterPress做,或者是什么。如果什么handleEnterPress是一个变量并且它的值已经改变了?如果你改变handleEnterPress你将需要再次“运行”效果,但如果你只使用[value],它不会“运行”handleEnterPress变化。在你的情况下,也许它永远不会改变,但反应不知道这一点,所以......它告诉你添加为依赖项。

e.g.

1 . In useEffect,您添加一个事件侦听器。

inputRef.current.addEventListener("keyup", handleEnterPress);
  1. 但随后你改变了handleEnterPress某种程度上(很多这不是你的情况,但这是预期的useEffect)
    而你没有handleEnterPress依赖于useEffect,所以它不会运行效果。

  2. Then value发生变化并清除效果

    () => inputRef.current.removeEventListener("keyup", handleEnterPress);
    

在这一部分中,您将尝试删除handleEnterPress的新值handleEnterPress,但不是第一步中的事件侦听器,因此您尝试删除不存在的事件侦听器。

首先handleEnterPress包含旧值的内容永远不会被删除。

这很糟糕,这就是您需要添加的原因handleEnterPress作为依赖

Edit:

When chips改变,handleEnterPress也会改变,因为你没有添加handleEnterPress对于依赖数组,您将始终拥有旧值handleEnterPress还有旧值chips.

我的回答中解释了您的情况,是这样的情况handleEnterPress更改,但事件侦听器仍然具有旧值handleEnterPress

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我们可以使用函数作为 useEffect 中的第二个参数吗 的相关文章

随机推荐

  • 返回最新“条纹”数据的行

    给出一个包含以下数据的简单表格 id result played 7 L 2012 01 07 6 L 2012 01 06 5 L 2012 01 05 4 W 2012 01 04 3 W 2012 01 03 2 L 2012 01
  • scipy.integrate.solve_ivp 不清楚如何求解形式 0=F(t, y(t), y'(t)) 的隐式 ODE

    目前 我确实使用assimulos 求解器套件 https jmodelica org assimulo tutorial imp html求解 0 F t y t y t 形式的隐式微分方程 我想使用本机 scipy 安装附带的求解器 并
  • Android页面卷曲动画

    有没有简单的方法来做Curl翻页动画 卷曲动画是页面翻转的动画 包括上面的页面滚动和下面的页面阴影 一次显示两页的 画廊 就像一本书一样 的推荐方法是什么 Is it 让适配器一次显示两个图像的线性布局 它不会让我像书一样显示一页翻过另一页
  • 为什么 echo 不返回与没有 echo 相同的结果

    我有以下案例 regex OK space alnum alnum text OK AAA BBBBBB aaabbbcccdddfffed asdadadadadadsada OK CCC KKKKKKK some text here O
  • C# 刷新 StreamWriter 和 MemoryStream

    我使用以下代码片段 我不确定是否需要调用Flush方法 一旦StreamWriter 一旦开启MemoryStream converts an xsd object to the corresponding xml string using
  • 如何在 Perl 中运行子命令正确导入环境?

    在从子命令导入环境时 我想将从 bash 脚本导出的所有环境变量添加到哈希中 什么时候program运行后 它将设置一些变量并导出它们 我想将这些变量保存在 Perl 脚本中供以后使用 但是我不想采用子命令中定义的 bash 函数 目前 我
  • 如何从 Java 获取 JanusGraphManagement

    我无法理解如何从使用ConfiguredGraphFactory 创建的图表中获取JanusGraphManagement 实例 我尝试做这样的事情 JanusGraphFactory Builder config JanusGraphFa
  • 更新 Popup.Animated 以播放 gif 直到外部任务完成 (PYSimpleGUI)

    我希望创建一个 UI 在执行另一项任务时显示动画弹出窗口 完成后将退出 我正在使用 PYSimpleGUI 并使用列出的示例here https github com PySimpleGUI PySimpleGUI blob master
  • 自定义注释不适用于 spring Bean

    我创建了新的自定义注释 MyCustomAnnotation Target ElementType METHOD ElementType TYPE ElementType FIELD Retention RUNTIME public int
  • com4j 与 jacob 从 Java 调用 COM 方法

    我维护一个遗留的 Java 应用程序 它使用Jacob http danadler com jacob 或Java COM Bridge 通过MS VBA和MS Word的COM接口进行调用 我一直在看com4j https com4j d
  • 实体框架中内容的国际化

    我不断遇到 i18n 要求 其中我的数据 而不是 UI 需要国际化 public class FooEntity public long Id get set public string Code get set Some values m
  • Groupby、移位和前向填充

    我有这个 df ID Date Time Lat Lon A 07 16 2019 08 00 29 39291 98 50925 A 07 16 2019 09 00 29 39923 98 51256 A 07 16 2019 10 0
  • 为应用程序操作创建自定义内置意图

    有一个可用的内置意图列表 可以在应用程序操作中使用谷歌开发者网站 https developers google com actions reference built in intents 我们有什么方法可以创建自定义的内置意图吗 不可以
  • Django Restframework、Django 通道、Ionic 2 - websocket 握手错误

    我目前正在开发一个使用线程标题中提到的技术的项目 我从浏览器中运行了这一切 该应用程序托管在 heroku 上 但是当我尝试从 Ionic 2 应用程序连接到 websockets 时 我总是在建立握手时遇到错误 2016 09 17T15
  • Excel 2007 及更高版本之间的 Range.Interior.Color 不同

    我发现 Range Interior Color 在某些情况下会为相同颜色返回不同的数字 具体取决于它是否在 Excel 2007 Excel 2010 或 2013 中运行 这是预期的吗 我很惊讶 Range Interior Color
  • Nginx 从旧 URL 重定向到新 URL

    我们正在更换房产搜索供应商 每个供应商的 URL 格式都略有不同 我们已经对 40 000 多个 URL 建立了索引 并希望将用户 301 重定向到新 URL URL 中的唯一区别是从下划线切换为连字符 以及从 idx 切换为 proper
  • 更新 Vector 中对象的属性

    我有一个包含对象的向量 这些对象有一个称为名字的属性 我想更新属性中的名字 为了做到这一点 我必须传递保存对象的向量 唯一标识每个对象的员工编号 最后是从用户输入中获取的新名称 我的问题是它在循环中显示更新名称 我用它来设置新名称 但如果我
  • Android:FastScrolling SectionIndexer getSections() 仅被调用一次

    我创建了一个ListView正在使用FastScroll 见图 当用户单击以下任何按钮 即所有曲目 艺术家 专辑 时 每次都会调用以下自定义 ArrayAdapter ArrayAdapter
  • Yii2:Ajax调用多个参数

    我使用此代码通过 ajax 调用自动填充 没有任何问题 我的视图文件中的代码 this gt registerJs dailywardentry doctor visit name on change function ajax url y
  • 我们可以使用函数作为 useEffect 中的第二个参数吗

    我有以下功能 function handleEnterPress e if e keyCode 13 if value let toAdd true chips forEach chip gt if chip value value toA