导航回屏幕时不会调用 useEffect - React Navigation

2024-01-04

我有一个屏幕,可以调用 api 来获取一些数据,然后显示

我看到的一个问题是,当我离开屏幕(我使用的是 React-navigation 6.x)然后返回到屏幕时useEffect()没有被调用

从我到目前为止读到的内容来看,这取决于userId不改变(我想我需要多读一些书useEffect()挂钩以更好地理解,也许有人会帮助解决这个问题)

import React, {useState, useEffect, useContext} from 'react';
import AppContext from '../../components/AppContext.js';

export const CreateNewEvent = () => {
  const globalContext = useContext(AppContext);
  const userId = globalContext.userInfo.id;

  useEffect(() => {
    const body = JSON.stringify({userId});
    fetch(eventTypesUrl, {
      method: 'POST',
      headers: {'Content-Type': 'application/json', Accept: 'application/json'},
      body: body,
    })
      .then(response => response.json())
      .then(json => setEventTypeData(json))
      .catch(error => console.error(error))
      .finally(() => setLoading(false));
    }, [userId]);

}

所以在我的场景中,我位于屏幕 1(在这里我可以创建一个事件,该事件发出请求以获取所有事件类型并将它们加载到选择菜单中)

当我导航到屏幕 2(以创建事件类型)然后返回屏幕 1 时,useEffect()未调用钩子,导致无法看到我刚刚创建的事件类型(希望这是有意义的)..还请注意,之前在屏幕 1 中输入的任何数据仍然保留

我遇到过这个post https://stackoverflow.com/questions/60182942/useeffect-not-called-in-react-native-when-back-to-screen这似乎就是我正在处理的问题,只是有点不确定如何使用我的设置来实现

如何确保当我返回时屏幕 2 进行 api 调用并且所有以前的表单数据都被清除?

Thanks


从本质上讲,当用户导航回该屏幕时,React Navigation 不会重新渲染屏幕以优化性能,并避免不必要的重新渲染。

当需要时,它们提供了一个有用的钩子来检测屏幕何时聚焦并运行一些副作用。

让我们重构代码如下:

Top-level import 
import { useFocusEffect } from "@react-navigation/core";

// Run side effects when screen focused, navigated, or visited 

useFocusEffect(
  React.useCallback(() => {
    const body = JSON.stringify({ userId });
    fetch(eventTypesUrl, {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json',
        Accept: 'application/json',
      },
      body: body,
    })
      .then(response => response.json())
      .then(json => setEventTypeData(json))
      .catch(error => console.error(error))
      .finally(() => setLoading(false));

    return () => {
      // Run  somelogisx when user leave screen,
      // Cleaning caches or cancelling subscriptions
    };
  }, [userId]),
);

Note: React.useCallback是其一部分useFocusEffectAPI。 React Navigation 团队尝试通过记忆来优化屏幕性能。

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

导航回屏幕时不会调用 useEffect - React Navigation 的相关文章

随机推荐

  • 在使用 MVP 模式构建的 ASP.NET Web 表单应用程序上应用依赖注入

    我正在使用 MVP 模式创建 ASP NET Web 表单应用程序 我的观点的结构是这样的 public partial class ShipperView System Web UI Page IShipperView ShipperPr
  • 使用 Dapper.NET 从存储过程调用获取 Oracle OUT 参数的值

    编辑 使用Execute方法而不是Query QueryMultiple方法 我的OUT SUCCESS参数现在有一个AttachedParam与 与 与OracleParameter有返回值 因此 例如 如果我仅需要检索非游标参数 那么这
  • 打包使用 ImageMagick C API 的应用程序

    我创建了一个使用 ImageMagick C API 的小型 Windows 应用程序 但遇到了一些困难 该应用程序运行良好 我已准备好与我们组织中的其他一些人共享它 但如果不在目标计算机上安装 ImageMagick 我找不到有关分发此类
  • 北欧航空公司。变量是否在数据步骤的每次迭代中都设置为缺失?

    我一直认为数据步骤的每次迭代都将变量设置为缺失 然而 在下面的代码中 变量看起来像是保留了最开始获取的值 我不明白为什么会发生这种情况 data one input x y datalines a 10 a 13 a 14 b 9 run
  • Apache Camel超时同步路由

    我正在 trwing 使用 Apache Camel 构造一个带有超时的同步路由 但我在框架中找不到任何可以解析它的内容 所以我决定建立一个为我制作的流程 public class TimeOutProcessor implements P
  • 为什么 Visual Studio 2019 社区中我的 SSIS 工具箱为空?

    我安装了 Visual Studio 2019 Community 然后安装了数据工具 我可以打开 Integration Services 项目 但当我查看 SSIS 工具箱时 它是空的 我该如何解决 我使用的是 Visual Studi
  • 无法加载 DLL“mqrt.dll”

    我开发了一个 WCF 服务 它作为 Windows 服务托管并公开 MSMQ 端点 我在 SERVER1 上有客户端应用程序 在 SERVER2 上有 MSMQ 和 WCF 服务 当 SERVER1 ClientApp 尝试将消息推送到 S
  • 数据准备好后如何关闭Loader

    In my Ionic 2app 中 我有一个使用服务的组件 该服务使用 http GET 来获取一些数据 然后 我的组件调用该服务 当数据可用时 它会设置并呈现该数据 看起来像以下 export class FarmList implem
  • 在 Access 中导入 Excel 数据

    我的 Access 应用程序中有一个表 需要填充一堆 Excel 文件中的数据 我尝试了这段代码 DoCmd TransferSpreadsheet acImport acSpreadsheetTypeExcel8 strTable str
  • 使用 BouncyCastle 在 C# 中读取 DER 私钥

    我正在尝试使用 BouncyCastle 将 RSA 私钥读入 Net 来测试我之前加密的数据 加密数据使用公钥和 Bouncy Castle 工作正常 我还使用了与下面相同的私钥 DER 格式 在 PHP 应用程序中成功解密我的数据 但我
  • VHDL门控时钟如何避免

    我收到了避免使用门控时钟的建议 因为它可能会导致松弛和时序限制问题 但我想问一下我可以认为什么是门控时钟 例如 此代码对时钟进行门控 因为 StopCount 对它进行门控 process ModuleCLK begin if rising
  • 无法从 Windows 主机连接到 WSL2 上的本地服务器

    我有一个Python项目使用waitress在 WSL2 Ubuntu 20 上的本地主机上提供服务 我从 VSCode 远程启动服务器 但无法使用地址从 Windows 上的浏览 器连接到它http 127 0 0 1 5998 http
  • Objective-C:如何替换 HTML 实体? [复制]

    这个问题在这里已经有答案了 我从互联网获取文本 它包含 html 实体 即 oacute 我想将此文本显示到自定义 iPhone 单元格中 我尝试在自定义单元格中使用 UIWebView 但我更喜欢使用多行 UILabel 问题是我找不到任
  • 如何让 favicon.ico 在龙卷风上工作

    龙卷风服务器默认不执行 favicon ico 所以我总是得到这样的信息 W 130626 10 38 16 web 1514 404 GET favicon ico 192 168 1 57 0 57ms 我以各种方式使用 web sta
  • 是否有用于 Java 或 PHP 的 OData 服务器库来公开 OData?

    我想知道是否有或为什么没有适用于 Java 的 ADO NET 数据服务服务器库 我需要从 Java 服务器公开数据库 但我只看到 Microsoft 为 java 提供客户端 而不是服务器部分 当您需要 NET Windows 来公开它时
  • CSS :before 和 :first-child 组合

    我使用以下代码在菜单项之间添加分隔符 navigation center li before content color fff 现在我希望第一个项目前面没有分隔符 所以我想出了以下代码 navigation center li befor
  • 在 Python 中递归地重新加载包(及其子模块)

    在 Python 中 您可以按如下方式重新加载模块 import foobar import importlib importlib reload foobar 这适用于 py文件 但对于 Python 包 它只会重新加载包并not任何嵌套
  • Angular HttpClient:“Blob”类型上不存在属性“headers”[重复]

    这个问题在这里已经有答案了 我正在使用 Angular 5 这是我从服务器下载文件的代码 1 服务 export url return this http get url responseType blob 2 组件代码 public do
  • ios6如何播放视频

    我很困惑 MPMoviePlayerViewController 和 MPMoviePlayerController 在 ios6 中本地播放视频的最佳方式是什么 这是我的代码 NSURL url NSURL fileURLWithPath
  • 导航回屏幕时不会调用 useEffect - React Navigation

    我有一个屏幕 可以调用 api 来获取一些数据 然后显示 我看到的一个问题是 当我离开屏幕 我使用的是 React navigation 6 x 然后返回到屏幕时useEffect 没有被调用 从我到目前为止读到的内容来看 这取决于user