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

标签 react-native navigation react-navigation-v6

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

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

从我目前阅读的内容来看,这取决于 userId 的值没有改变(我认为我需要围绕 useEffect() 做更多的阅读钩子(Hook)更好地理解,也许有人会帮助解决这个问题)

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() Hook ,导致无法看到我刚才的事件类型已创建(希望有意义).. 还请注意,之前在屏幕 1 中输入的任何数据仍然保留

我遇到过这个post这似乎是我正在处理的,只是有点不确定如何用我的设置来实现

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

谢谢

最佳答案

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

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

让我们重构代码如下:

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]))



注意: React.useCallbackuseFocusEffect API 的一部分。 React Navigation 团队试图通过 memoization 优化屏幕性能。

关于react-native - 导航回屏幕时不调用useEffect - React Navigation,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70622599/

相关文章:

ios - 用于 firebase 云消息传递的 FCM token 有时未注册

android - 当我在 android studio 中添加导航时,出现 "Build gradle start up"错误和 "unable to resolve class val :13"错误

css - 使用 jquery mobile 的 youtube 移动风格导航

javascript - 如何使用 React Navigation 6.x Native Stack Navigator (RN>0.6) 实现 React-native-gesture-handler?

react-native - 打开 Bottom Sheet 时如何实现黑色透明的react-native-raw-bottom-sheet?

react-native - Redux-Persist 与 React-Native-Background-Fetch

android - 如何使用导航组件保留最后打开的 fragment

reactjs - 在 React-navigation 6+ 中深度链接屏幕的多个路径

javascript - 检索设备信息 React-Native iOS