Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Reactjs 当我从屏幕B返回到屏幕A时,如何重新播放屏幕A?_Reactjs_React Native_React Native Android_React Native Ios - Fatal编程技术网

Reactjs 当我从屏幕B返回到屏幕A时,如何重新播放屏幕A?

Reactjs 当我从屏幕B返回到屏幕A时,如何重新播放屏幕A?,reactjs,react-native,react-native-android,react-native-ios,Reactjs,React Native,React Native Android,React Native Ios,预期的行为: 屏幕A单击导航到屏幕B->最后导航到屏幕C 屏幕C将数据设置为异步存储->BackHandler导航到屏幕A 屏幕A检查状态的更改,并使用更改重新启动屏幕 但是 在我重新加载或手动进行任何更改之前,屏幕A不会重新加载 屏幕显示一个useffect()代码: 屏幕C后台处理程序代码: useEffect(() => { retreiveData(); BackHandler.addEventListener('hardwareBackPress', hand

预期的行为:

  • 屏幕A单击导航到屏幕B->最后导航到屏幕C
  • 屏幕C将数据设置为异步存储->BackHandler导航到屏幕A
  • 屏幕A检查状态的更改,并使用更改重新启动屏幕
但是 在我重新加载或手动进行任何更改之前,屏幕A不会重新加载

屏幕显示一个useffect()代码:

屏幕C后台处理程序代码:

useEffect(() => {
    retreiveData();
    BackHandler.addEventListener('hardwareBackPress', handleBackButtonOnnclick);
    return () => {
      BackHandler.removeEventListener(
        'hardwareBackPress',
        handleBackButtonOnnclick,
      );
    };
  }, []);
function handleBackButtonOnnclick() {
    storeData();
    navigation.navigate('Home', {
      screen: 'Home',
      params: {
        assessment_age: assessment_age,
      },
    });
    return true;
  }

const storeData = async () => {
    try {
      await AsyncStorage.setItem(
        'assessment_age',
        assessment_age.toString(),
      ).then(
        console.log('assessment age stored -->', assessment_age.toString()),
      );
    } catch (e) {
      console.log('assessment age store error--->', e);
    }
  };
希望我已经澄清了我的问题,那就是在屏幕A中营养评估年龄的每一个变化,我想重新播放屏幕

请让我知道我怎样才能做到这一点。有点太久了。任何线索都很好

根据建议,如果我能使用我的效果

React.useEffect(() => {
    const unsubscribe = navigation.addListener('focus', () => {
      console.log('nutri ass age', nutrition_assessment_age);
      getNutritionAssessmentage();
      
      if (isValidObject(User) && isValidObject(mSChildId)) {
        if (loadApi == true) {
          getHomeTabMainAPI();
          setLoadApi(false);
          setSelectedChild(getChildFromUserChildrenList());
        }
      } else {
        if (!isValidObject(User) || !isValidObject(mSChildId)) {
          getUserData();
        }
      }
    });

    return unsubscribe;
  }, [User, mSChildId, loadApi, nutrition_assessment_age,navigation]);

它显示为空白,未提取任何数据

我将使用
反应导航
生命周期方法,检查它们

我在使用react导航时遇到了与您相同的问题,因为react生命周期不会在导航更改时触发,因此我会采用以下方法:

例子: 尝试将此应用于屏幕A:

import { useFocusEffect } from '@react-navigation/native';

function ScreenA() {
  useFocusEffect(
    React.useCallback(() => {
      // Screen A is focused, initialize the state, or do whatever checking you need.

      return () => {
        // Screen A is unfocused, clear the state, clear async storage, or whatever you need
      };
    }, [])
  );

  return <div>Screen A!</div>;
}
从'@react navigation/native'导入{useFocusEffect};
函数ScreenA(){
聚焦效应(
React.useCallback(()=>{
//屏幕A已聚焦,初始化状态,或执行任何需要的检查。
return()=>{
//屏幕A未聚焦,请清除状态、清除异步存储或任何您需要的内容
};
}, [])
);
返回屏幕A!;
}
您还可以将其应用于react的挂钩,如下所示:

function ScreenA({ navigation }) {
  React.useEffect(() => {
    const unsubscribe = navigation.addListener('focus', () => {
      // Screen was focused
      // Do something
    });

    return unsubscribe;
  }, [navigation]);

  return <div>Screen A!</div>;
}
函数ScreenA({navigation}){
React.useffect(()=>{
const unsubscribe=navigation.addListener('focus',()=>{
//屏幕被聚焦
//做点什么
});
退订;
},[导航];
返回屏幕A!;
}

您是否使用react导航进行路由选择?是@Antonioredeljaci已根据您的建议编辑了我的答案,但现在我的数据未被提取,因为getHomeTabMainAPI()中的数据根本未被调用,有何建议?
function ScreenA({ navigation }) {
  React.useEffect(() => {
    const unsubscribe = navigation.addListener('focus', () => {
      // Screen was focused
      // Do something
    });

    return unsubscribe;
  }, [navigation]);

  return <div>Screen A!</div>;
}