this.props.navigation 与反应导航中的 NavigationActions

this.props.navigation vs NavigationActions in react-navigation

NavigationActions 支持以下操作,但当我们使用 this.props.navigation.

访问辅助函数时,我无法理解每个操作的用法

那么为什么我们必须导入 NavigationActions

提前致谢。

这些辅助函数中的每一个都映射到 navigation.dispatch(action),具有与 NavigationActions 不同的动作对象。

在某些情况下您仍然需要使用它们,例如,当使用 navigate 时,您可以通过指定要在导航器上发生的子操作来更改不止一个级别的导航层次结构你刚刚路由到。

this.props.navigation.navigate("some-root", {param: "value"}, someOtherAction)

其中 someOtherAction 可以是任何操作对象。

您可以找到更多信息here

它们都有很多用法,但让我举几个例子。

示例 1 setParams

假设您有一个带有 2 个屏幕的 StackNavigator

const Navigator = StackNavigator({
  Home: { screen: Home },
  Items: { screen: Items },
  Profile: { screen: Profile }
});

现在假设您导航到 Items 屏幕,然后导航到 Profile 屏幕,并且您正在根据 this.props.navigation.state.params.type 列出 Items。假设可以通过 Profile 屏幕设置此类型。

当用户更改类型设置时,您需要重新渲染 Items 屏幕。但是当您从 Profile 屏幕执行 this.props.navigation.goBack() 时,除非您对道具或状态进行一些更改,否则 Items 屏幕将不会重新渲染。

在这个位置 setParams 需要采取行动。尽管您可以在 Profile 屏幕上使用 this.props.navigation.setParams,但它会为当前屏幕设置参数。

NavigationActions 允许您为其他屏幕设置参数 key 属性 这些屏幕。

示例 2重置和导航

在您的应用程序中的某个时刻(注销、刷新、通知等),您可能想要重置导航堆栈,然后重新创建具有所需位置的堆栈。

当用户收到通知时,重定向到相关 post/article/message 是预期的行为,当用户想要返回时,用户应该重定向到正确的屏幕。此时,您可以通过组合 resetnavigate 操作来模拟用户导航。

这些操作还有很多用例。但最后,如果您不需要它们,则不必导入它们。在某些时候,如果您需要它们,您将了解如何更多地使用它们。

除了@bennygenel 所说的,NavigationActions 也很适合在嵌套堆栈中导航。 例如,从一个屏幕导航到不同堆栈中的屏幕。

示例:

index.js

const StackOpportunityNavigator = createStackNavigator(
  {
    MainOpportunity: OpportunityScreen,
    SecondScreen: SecondScreen
  },
  {
    initialRouteName: 'MainOpportunity',
    headerMode: 'none',
    transitionConfig: () => fromLeft(600)
  }
);

const DrawerNavigationOptions = createDrawerNavigator(
  {
    OpportunityStack: { screen: StackOpportunityNavigator },
    History: HistoryScreen
  },
  {
    contentComponent: props => <SideBar {...props} />,
    drawerPosition: 'right',
    headerMode: 'none',
    transitionConfig: () => fromLeft(600)
  }
);

const LoginNavigator = createStackNavigator(
  {
    LoadingScreen: LoadingScreen,
    LoginScreen: LoginScreen,
    DrawerNavigator: DrawerNavigationOptions
  },
  {
    transitionConfig: () => fromLeft(600),
    navigationOptions: {
      header: props => <HeaderBar {...props} />
    }
  }
);

export default LoginNavigator;

现在我可以从 LoginScreen.js 导航到主屏幕(OpportunityScreen.js),方法是编写需要从一个屏幕到另一个屏幕的整个嵌套导航路径:

const navigateToMainScreen = NavigationActions.navigate({
        routeName: 'DrawerNavigator',      
        action: NavigationActions.navigate({
          routeName: 'OpportunityStack',
          action: NavigationActions.navigate({
            routeName: 'MainOpportunity'
          })
        })
      });
_this.props.navigation.dispatch(navigateToMainScreen);

希望对您有所帮助:)