为什么更新的状态没有反映在事件侦听器中:React Native、Hooks

2024-04-30

我正在使用钩子来更新状态。在我的代码中,我有一个 AppState 事件侦听器,每当它触发时,我都会更新appState using 设置应用程序状态,但是事件监听器内的 appState 没有改变。但该值正在侦听器外部更新。谁能解释为什么会有这样的行为?

这是我的代码:

    import React, { FunctionComponent, useEffect, useState } from "react"
    import { View, AppState, AppStateStatus } from "react-native"
    const Test: FunctionComponent<any> = (props: any) => {
        const [appState, setAppState] = useState < AppStateStatus > (AppState.currentState)
    
        useEffect(() => {
            AppState.addEventListener("change", _handleAppStateChange)
        },[])
    
        const _handleAppStateChange = (nextAppState: AppStateStatus) => {
         //appState not Changing here
            console.log(appState, "app state")
            if (appState.match(/inactive|background/) && nextAppState === "active") {
                console.log("App has come to the foreground!")
                activateRealtime()
            } else if (appState === "active" && nextAppState.match(/inactive|background/)) {
                console.log("App has come to background!")
            }
            setAppState(nextAppState)
        }
       //appState updated here
       console.log(appState, "app state")
        return <View />
    }

在您的代码中,appState 是陈旧的封闭 https://dmitripavlutin.com/react-hooks-stale-closures/ 短绒棉 https://github.com/facebook/react/issues/14920应该告诉你你缺少依赖项。

我认为以下内容会起作用

const _handleAppStateChange = useCallback(
  (nextAppState) =>
    //use callback for state setter so you don't
    //  create needless dependency or (as you did)
    //  create a stale closure
    setAppState((currentAppState) => {
      //logs current appstate
      console.log(currentAppState, 'app state');
      if (
        currentAppState.match(/inactive|background/) &&
        nextAppState === 'active'
      ) {
        console.log('App has come to the foreground!');
        activateRealtime();
      } else if (
        currentAppState === 'active' &&
        nextAppState.match(/inactive|background/)
      ) {
        console.log('App has come to background!');
      }
      return nextAppState;
    }),
  //only pass function as _handleAppStateChange
  //  on mount by providing empty dependency
  []
);
useEffect(() => {
  AppState.addEventListener(
    'change',
    _handleAppStateChange
  );
  //clean up code when component unmounts
  return () =>
    AppState.removeEventListener(
      'change',
      _handleAppStateChange
    );
  //_handleAppStateChange is a dependency but useCallback
  //  has empty dependency so it is only created on mount
}, [_handleAppStateChange]);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么更新的状态没有反映在事件侦听器中:React Native、Hooks 的相关文章

  • Angular 2 Material 2 日期选择器日期格式

    我不知道如何更改材料2日期选择器的日期格式 我已阅读文档 但我不明白我实际上需要做什么 datepicker默认提供的输出日期格式为f e 6 9 2017 我想要实现的目标是将格式更改为类似的格式9 Jun 2017或任何其他 文档htt
  • 创建一个简单的 10 秒倒计时

    我想要一行这样写的 Your download will begin in 10 9 8 etc Beginning on page load seconds 我已经设置了 10 秒下载文本 并且我还查看了其他 stackoverflow
  • html 表格单元格的条件格式

    是否有现成的解决方案可以对 HTML 表格进行条件格式设置 通过条件格式 我更感兴趣的是根据该列或其他列 在同一个表中 的值 数字 将不同的颜色作为单元格背景 类似于我们在 Excel 条件格式 gt 色阶 gt 红黄绿中的内容 我想在通过
  • 在鼠标光标位置添加 cytoscape 节点

    我想在画布上的单击事件上的鼠标箭头位置添加一个 cytoscape 节点 我怎样才能做到这一点 我的方法 效果不太好 我可以通过单击创建一个节点 但无法确保创建的节点的位置位于我单击的位置 使用这样的东西 cy click function
  • 如何导入和导出 javascript ES6 类

    我是 javascript 和 nodejs 的新手 我正在使用这个项目来发展我的技能并学习新技术 目前我的项目使用多个相互依赖的类 类文件位于不同的目录中 我当前正在尝试使用 export 和 require 语句来允许在其他文件中引用类
  • 以一定时间间隔连续重复运行 JavaScript 函数

    这是我的第一个问题 希望您尽快回答 我想要代码连续重复一个函数 我尝试了一些代码 但没有成功 我尝试了这段代码 我想在一段时间后重复这个功能 我努力了setInterval and setTimeout 但是 我还没有收到结果 这将重复该任
  • Web 组件 - 服务/非 html 组件

    所以我来自 Angular 想看看如何创建vanilla Web components 现在 从 Angular 开始 我们倾向于将事物分开 组件 充当 HTML CSS 和一些 javascript 然后是 服务 主要负责收集数据和执行不
  • 为什么 length 是 `Array` 的属性而不是 `Array.prototype` 链

    所以我在 V8 控制台上玩了很多 我做到了 Object getOwnPropertyNames 我期望得到 结果 然而 length 所以这意味着不是成为原型链的一部分 length是所有人的成员财产Array对象 这是一个错误 还是有任
  • 如何动态突出显示网页上的字符串?

    我想创建带有 url 的页面 例如 http xyzcorp schedules 2015Aug24 Aug28 Jim Hawkins http xyzcorp schedules 2015Aug24 Aug28 Billy Bones
  • 确定元素是在页面折叠上方还是下方

    我有一些页面有多个输入框 用户可以在其中输入文本 在单击 下一步 按钮之前 需要填写其中一些内容 我弹出验证错误供用户查看 但是如果问题不在页面上 我希望页面滚动到它 而不是他们必须搜索丢失 错误的字段 我有一个滚动到位 但我无法确定要滚动
  • 无法实例化模块 [$injector:unpr] 未知提供程序:$routeProvider

    我从 AngularJS 升级时收到此错误1 0 7 to 1 2 0rc1 ngRoute 模块不再是核心的一部分angular js文件 如果您继续使用 routeProvider 那么您现在需要包括angular route js在你
  • console.log() 显示同一对象属性的矛盾值

    我想我可能要疯了 我使用 console log 来查看对象的状态 然后在下一行对同一对象的特定属性执行 console log 并为每个属性获取不同的值 我正在使用的代码是 console log this pictures Items
  • 如何更改自动完成中的结果过滤器?

    我不想进行字面匹配 而是想通过正则表达式选择结果 我可以覆盖自动完成的默认行为来完成此任务还是需要替代结构 有一个内置的方法可以做到这一点 只需提供一个函数source http jqueryui com demos autocomplet
  • 为什么 Web Worker 性能在 30 秒后急剧下降?

    我正在尝试提高在网络工作人员中执行时脚本的性能 它旨在解析浏览器中的大型文本文件而不会崩溃 一切都运行得很好 但我注意到使用网络工作者时大文件的性能存在严重差异 于是我做了一个简单的实验 我在同一输入上运行脚本两次 第一次运行在页面的主线程
  • 在 Fabric.js 中按宽度/高度在另一个画布对象内居中和缩放画布对象

    Goal 将一个对象 水平和垂直 置于另一个对象 矩形或组 的中心canvas via Fabric js或者通过Javascript保持原始对象的长宽比相同 但也不超过父对象的宽度 高度比例 父对象 矩形或组 不会居中于canvas元素
  • 在不同环境中运行的react.js redux生产构建中将环境变量渲染到浏览器

    React redux realworld io 应用程序的自述文件位于https github com gothinkster react redux realworld example app https github com goth
  • Node.js 未处理的“错误”事件

    我编写了一个简单的代码并将其保存在文件 try js 中 var http require http var makeRequest function message var options host localhost port 8080
  • 当应用程序未运行时,如何在 React Native 应用程序中读取传入的短信?

    有几个可用的 ReactNative 短信插件 但大多数在应用程序位于前台时读取短信 当应用程序甚至没有运行时 我如何读取短信 就像本机短信阅读器应用程序一样 我不知道有任何可用的库 但你可以这样做 创建一个BackgroundScanSe
  • 从 DirectionsRenderer 中获取折线或标记的事件

    我正在使用 DirectionsService 和路线方法来生成 DirectionsResult 我还使用 DirectionsRenderer 对象来显示结果 因为它非常易于使用 我在检测 Directions changed 事件时没
  • 尝试在 React 应用程序中连接到 MySQL 数据库时,无法读取未定义的属性(读取“查询”)错误

    我正在尝试连接到 MySQL 数据库并在单击按钮后在 React 应用程序中运行查询 一些它如何给出错误 我当前的代码如下所示 import mysql from mysql function App async function sync

随机推荐

  • MVC 中的外键注释

    我有两张桌子 State StateID int StateName string City CityID int StateID int CityName string 我正在使用代码优先方法开发 MVC4 代码 我正在使用State a
  • 剑道网格服务器端过滤并且不工作

    我正在使用 Kendo 网格 具有服务器端过滤 排序和分页功能 这是我初始化网格的代码 在此代码中 服务器端分页和虚拟滚动正常工作 但过滤和短路不起作用 在任何请求中 我都会得到这个 请求参数的类型 HttpPost public Json
  • 数组奇偶排序

    我有一个数组 其中有一些数字 现在我想对单独的数组中的偶数进行排序 对单独的奇数进行排序 有没有 API 可以做到这一点 我试过这样 int array sort 5 12 3 21 8 7 19 102 201 int even sort
  • 如何删除 XML::Simple 输出中的 标记?

    我正在使用 Perl 创建一个 XML 文件 XML 简单 http search cpan org dist XML Simple模块 我成功创建了 XML 文件 但问题是我遇到了
  • Cabal 在 NixOS 上构建时找不到外部库

    我正在尝试使用 cabal2nix 在 NixOS 上构建一个内部 Haskell 项目 它包装 并因此依赖 一个外部库 在 Ubuntu 上可以通过以下方式构建 wget设置源 然后运行make make install ldconfig
  • Python 记录器应该作为参数传递吗? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我们正在开发的 Python 应用程序需要一个记录器 一位同事认为应该在每个使用它的类中创建和配置记录器 我的观点是 它应该在应用程序启动时创建
  • Excel VBA - 将 .xls 附加到文件名以打开文件

    我有代码可以打开带有可变日期的文件 如下所示 如果不在输入框中输入 m d y xls 此代码将无法运行 我只想在输入框中输入 m d y 请看一下并让我知道我缺少什么 谢谢 Dim wbkOpen As Workbook Dim strF
  • 如何使用 spring-test-junit5 进行嵌套测试?

    我一直在玩JUnit 5 http junit org junit5 and 弹簧测试junit5 https github com sbrannen spring test junit5 然后我尝试使用嵌套测试 http junit or
  • Firebase 云功能 - Stripe Connect Webhook 未触发

    我正在尝试设置我的 stripe webhook 以便在创建 更新 Stripe Connect 帐户或执行任何操作时自动调用 Firebase 云函数 仅当我手动转到 Stripe 仪表板 gt Webhooks 并点击 发送测试 Web
  • 在给定时间后停止 java 中的线程 - 不起作用

    我有一个复杂的函数 优化 可能会进入循环或只是花费太多时间 并且允许的时间由用户设置 因此 我试图在单独的线程中运行该函数 并在超过最大时间时停止它 我使用类似于下面的代码 但它不起作用 所以 int timeMax 2 time in m
  • 如何处理WPF中Grid Splitter生成的事件?

    我想要一个事件处理程序来处理移动网格拆分器时的事件 我不确定是否有一个 如果没有 我想我可以在行大小更改时生成一个事件 Thanks 您可以更改行的大小 但 GridSplitter 本身是一个 Thumb 因此有自己的事件 例如 Drag
  • 数据库索引:是好事、坏事还是浪费时间?

    这里通常建议添加索引作为性能问题的补救措施 我只讨论读取和查询 我们都知道索引会使写入速度变慢 多年来 我在 DB2 和 MSSQL 上多次尝试过这种补救措施 但结果总是令人失望 我的发现是 无论索引会让事情变得更好是多么 明显 事实证明查
  • glutPostRedisplay 不在循环内工作

    我试图让一个人在 y 轴上跳跃 所以我使用 2 秒的循环 第一秒它应该向下移动并弯曲膝盖 第二秒它应该向上移动 然后在起始位置完成 现在我刚刚开始让这个人在第一秒内跪下并弯曲膝盖 我还没有编写动画的其余部分 问题是 glutPostRedi
  • 带有反应导航的自定义图标 5

    我正在尝试将自定义图标与反应选项卡导航一起使用 但是 所有教程和文档 总是只涵盖通过 Ionicons 或 Materialdesign 实现图标 有没有办法实现我自己的图标 代码如下
  • 使用 const shared_ptr<> 的基于范围的 for 循环

    我有一个容器shared ptr lt gt 例如Avector
  • 如何将 DateTime 转换为自 1970 年以来的秒数?

    我正在尝试将 C DateTime 变量转换为 Unix 时间 即自 1970 年 1 月 1 日以来的秒数 看起来 DateTime 实际上是作为自 0001 年 1 月 1 日以来的 刻度 数来实现的 我目前的想法是从我的 DateTi
  • 使用虚假数据生成回形针图像上传 - Ruby on Rails Populator / Faker Gems

    我目前正在尝试用一堆假数据填充项目的开发数据库 以模拟数百篇文章 用户的外观和操作方式 我研究了不同的宝石来完成任务 例如 Factory Girl 但文档非常缺乏 我没有得到它 但最终使用了 Populator 和 Faker gems
  • php 登录curl 代码未按预期工作

    我正在尝试使用 php 中的curl 函数登录到特定页面 请检查下面的代码 我在 banggood com 连接我的电子邮件和密码 然后我想重定向到另一个私人页面 但它无法按预期工作 我没有收到任何错误 我被重定向到此页面 https ww
  • 如何将一个数表示为4个素数之和?

    这是问题所在 四个素数的和 http acm uva es p v101 10168 html 指出 输入的每一行包含一个整数 N N 输入示例 24 36 46 示例输出 3 11 3 73 7 13 1311 11 17 7 我第一眼就
  • 为什么更新的状态没有反映在事件侦听器中:React Native、Hooks

    我正在使用钩子来更新状态 在我的代码中 我有一个 AppState 事件侦听器 每当它触发时 我都会更新appState using 设置应用程序状态 但是事件监听器内的 appState 没有改变 但该值正在侦听器外部更新 谁能解释为什么