在功能组件中使用回调来响应 setState

2023-12-28

我在类组件中编写了一个非常简单的示例:

    setErrorMessage(msg) {
      this.setState({error_message: msg}, () => {
          setTimeout(() => {
              this.setState({error_message: ''})
          }, 5000);
      });
    }

所以这里我称之为setState()方法并给它一个回调作为第二个参数。

我想知道是否可以使用 useState 挂钩在功能组件内执行此操作。

据我所知,您无法将回调传递给该挂钩的 setState 函数。当我使用useEffecthook - 它最终陷入无限循环:

所以我猜 - 这个功能没有包含在功能组件中?


回调功能在react-hooks中不可用,但您可以使用编写一个简单的解决方法useEffect and useRef.

const [errorMessage, setErrorMessage] = useState('')
const isChanged = useRef(false);
useEffect(() => {
   if(errorMessage) { // Add an existential condition so that useEffect doesn't run for empty message on first rendering
       setTimeout(() => {
          setErrorMessage('');
       }, 5000);
   }

}, [isChanged.current]); // Now the mutation will not run unless a re-render happens but setErrorMessage does create a re-render

const addErrorMessage = (msg) => {
  setErrorMessage(msg);
  isChanged.current = !isChanged.current; // intentionally trigger a change
}

上面的示例考虑到这样一个事实:您可能也想从其他地方设置 errorMessage,而您又不想重置它。但是,如果您想在每次设置ErrorMessage时重置消息,您可以简单地编写一个正常的useEffect,例如

useEffect(() => {
    if(errorMessage !== ""){ // This check is very important, without it there will be an infinite loop
        setTimeout(() => {
              setErrorMessage('');
         }, 5000);
    }

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

在功能组件中使用回调来响应 setState 的相关文章

随机推荐

  • FileHelpers 字段中的引号和逗号

    我有一个 csv 文件 正在使用 FileHelpers 进行解析 并且我遇到了引号和逗号都可以出现在字段中的情况 Comma 323 PC 28 02 2014 UNI001 5000 0 Return Returned Goods da
  • iCloud 无处不在的容器在应用程序删除时没有被清理?

    我正在将带有 Core Data 的 iCloud 添加到应用程序商店中已存在的应用程序中 因此我需要测试升级方案 然而 当我从设备中删除应用程序并从 Xcode 重新安装它时 我注意到设备上普遍存在的容器文件夹中的所有内容都被保留了 这非
  • 将从 C 例程分配的数组传递给 Ada

    将结构 记录数组从 Ada 传递到 C 例程是一回事 在本例中 内存管理是在 Ada 中完成的 但是在与第三方库接口时经常会出现这样的问题 内存管理是在C部分完成的 例如 对于 C 结构 typedef struct MYREC int n
  • 如何将流星的速度测试与詹金斯集成?

    On Velocity 的 GH 页面 https github com xolvio velocity benefits它提到 简单的 CI 集成 是其中的好处之一 但我还没有看到任何有关它的文档 如何将 Velocity 与 Jenki
  • 在 Go 中如何处理没有日期的挂钟时间?

    我想知道 Golang 中是否有任何现有的包可以处理没有日期的日期时间 问题如下 想象一下 我想存储有关公司轮班的信息 包括轮班开始和结束的时间 我会创建如下内容 import time type Shift struct StartTim
  • 删除 XML 字符串中的空格

    如何删除 Python 2 6 中 XML 字符串中的空格和换行符 我尝试了以下软件包 etree 此片段保留原始空格 xmlStr
  • 在 F# 中将 seq 转换为 string[]

    示例来自这个帖子 https stackoverflow com questions 6144274 string replace utility conversion from python to f有一个例子 open System I
  • 安装 SQL Server 2008 Developer 时要使用哪些帐户

    我在这里安装 SQL Server 2008 Developer 在安装的服务器配置步骤中 它询问我有关服务帐户的信息 我在这里选择什么 我可以在屏幕截图中看到可用的选项 尽管在大多数选项中我只能选择其中的两到三个 当我点击对所有 SQL
  • 如何防止 Tkinter 窗口在被调用之前打开?

    当我运行此脚本时 会出现两个窗口 一个用于文件选择 另一个窗口用于 Tkinter 窗口 如何更改此设置 以便 Tkinter 窗口仅在选择文件后打开 谢谢 def main my file askopenfilename stage1 d
  • 在通过桥接的 docker 容器中时无法访问 SSL IP。获取 SSL_ERROR_SYSCALL

    我在通过 IP TLS 连接到任何服务器时遇到问题 但仅在 默认 网桥中运行时从 Docker 容器内连接 我总是得到 OpenSSL SSL connect SSL ERROR SYSCALL in connection to W X Y
  • C# 中的 IPC,将文本从一个 exe 发送到另一个 exe

    我想将消息从 WPF 应用程序的文本框发送到打开的记事本 我的意思是 单击文本框旁边的按钮后 我希望将内容写入记事本 如何在两个不同的应用程序之间发送消息 DllImport user32 dll EntryPoint FindWindow
  • 有没有办法在运行时加载类 jar 和包?

    我想知道是否有办法在运行时加载类和jar 绝对 创建一个合适的ClassLoader实例 例如使用URL类加载器 http java sun com javase 6 docs api java net URLClassLoader htm
  • Pandas - Python - 如何减去两个不同的日期列

    尝试用今天的日期减去created date列来填充列 但出现以下错误 TypeError unsupported operand type s for str and str import datetime now datetime da
  • 连接 Haskell 和 C++

    我想在 C 程序中调用一些 Haskell 函数 为此 我已申请these https github com jarrett cpphs说明并将其调整为我的代码和系统 我目前所掌握的内容如下 主程序 cpp 共享头文件和cpp文件 make
  • 在 setup.cfg 中嵌套或组合 setuptools 的 extras_require

    是否可以重用已在中指定的依赖项 options extras require 对于其他条目 options extras require 举例来说 一个开发团队正在使用mypy在开发过程中检查它们的类型注释 以及black自动格式化他们的代
  • 我在哪里可以获得 VB6 IDE [重复]

    这个问题在这里已经有答案了 可能的重复 如何编译旧版 VB6 代码 https stackoverflow com questions 229868 how to compile legacy vb6 code 在哪里可以找到 VB6 的
  • 生成拼写错误的单词(打字错误)

    我已经实现了模糊匹配算法 我想使用一些带有测试数据的示例查询来评估其召回率 假设我有一个包含文本的文档 text The quick brown fox jumps over the lazy dog 我想看看是否可以通过测试诸如 sox
  • 如何在 CentOS 7 中安装 pip?

    CentOS 7 EPEL 现在包含 Python 3 4 yum install python34 然而 当我尝试这样做时 即使 Python 3 4 安装成功 它似乎也没有安装 pip 这很奇怪 因为pipPython 3 4 应该默认
  • 谷歌财经 API 从 2017 年 9 月 6 日起不再工作

    我使用谷歌金融 API 来获取股票报价并在我的网站上显示内容 从 2017 年 9 月 6 日起 此功能突然停止工作 我用来获取股票报价的网址是 以前 我使用的是雅虎财经 API 它不一致 所以 我切换到了谷歌金融API 你能帮我解决这个问
  • 在功能组件中使用回调来响应 setState

    我在类组件中编写了一个非常简单的示例 setErrorMessage msg this setState error message msg gt setTimeout gt this setState error message 5000