开发者问题收集

React-Native 导航使用 useEffect 和 setTimeout 跳转到错误屏幕

2021-06-25
1057

我有一个导航堆栈,其中包含不同的屏幕,我想让它们一个接一个地渲染。我将超时设置为 5 秒,因此它将转到堆栈中的下一个屏幕。

<Stack.Screen name="StoryScreenOne" component={StoryScreenOne} />
<Stack.Screen name="StoryScreenTwo" component={StoryScreenTwo} />
<Stack.Screen name="StoryScreenThree" component={StoryScreenThree} />

我的超时函数是这样的

useEffect(() => {
        setTimeout(() => {
            props.navigation.navigate('StoryScreenTwo');
        }, 5000);
    });

问题是,如果我在屏幕二上并导航回屏幕一,则渲染的下一个屏幕是屏幕三,而不是我想要的屏幕二。

有什么技巧吗?

1个回答

如果我理解正确的话,当您到达第二个屏幕时,还有另一个 useEffect ,如下所示:

useEffect(() => {
    setTimeout(() => {
 props.navigation.navigate('StoryScreenThree');
        }, 5000);
    });

我认为 setTimeout 仍在运行,因此如果您想在 goBack 上重新渲染第二个屏幕,则需要在按下返回按钮时使用 clearTimeOut。 看看这个: https://developer.mozilla.org/en-US/docs/Learn/JavaScript/Asynchronous/Timeouts_and_intervals 但是当您导航时,您的第一个屏幕不会卸载,因此您需要使用监听器重新启动 UseEffect ,如下所示:

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

function Profile() {
  useFocusEffect(
    React.useCallback(() => {
      // Do something when the screen is focused

      return () => {
        // Do something when the screen is unfocused
        // Useful for cleanup functions
      };
    }, [])
  );

  return <ProfileContent />;
}

更多信息请点击此处: https://reactnavigation.org/docs/navigation-lifecycle/

Dirk
2021-06-25