我有一个后退按钮,可以让用户返回一个屏幕,但当没有屏幕可供返回时,我希望它做其他事情,所以这是我的代码:

<Button onPress={()=>{
   if(CanGoBack){ // imaginary 'CanGoBack' variable
     this.props.navigation.goBack()
   }else{
     this.doSomething()
   }
}}/>

我怎样才能做到这一点?

推荐答案

注意:这个答案最初是为react-navigationv3.3.0写的.您应该查看当前文档中的react-navigation条,以确保仍然支持该方法,以及是否有任何更改/更简单的方法.

React-Navigation v3

this.props.navigation中有一个函数叫做dangerouslyGetParent.

它在第documentation条中陈述了以下内容:

另一个很好的用例是找到活动对象的索引

所以我们可以使用下面的方法来获得路由的索引

this.props.navigation.dangerouslyGetParent().state.index

所以我们可以用下面的方法在你们ButtononPress中判断我们是否回到了路由的起点.

<Button onPress={() => {
  // get the index of the route
  let index = this.props.navigation.dangerouslyGetParent().state.index;
  // handle the index we get
  if (index > 0) {
    this.props.navigation.goBack();
  } else {
    this.doSomething();
  }
}}/>

Update for React-Navigation v5

documentation中,我们可以看到dangerouslyGetParent仍然存在.

此方法从父导航器返回导航props

因此,在v5中对v3使用上述方法是可能的.


canGoBack() in v5

还有一个名为canGoBack()的未记录api.这可以通过以下方式从导航props 访问:

this.props.navigation.canGoBack()

如果可以返回堆栈,则此属性将返回布尔值.这意味着我们可以通过以下方式更新我们为v3所做的代码.

<Button onPress={() => {
  // check to see if it is possible to go back
  let canGoBack = this.props.navigation.canGoBack();
  // handle what we do it we can/cannot go back
  if (canGoBack) {
    this.props.navigation.goBack();
  } else {
    this.doSomething();
  }
}}/>

然而,由于这是一个未记录的api,它很容易更改,因此依赖它可能会有风险.

React-native相关问答推荐

一旦我关闭应用程序,Json struct 就会发生变化

获取 TypeError:this.InnerNativeModule.configureProps 不是 mac 上 expo 中的函数

应用程序主体尚未注册

如何在 Recompose 中使用 withHandlers 将 refs 添加到功能组件并在 ScrollView 上调用 ScrollTo?

React js 做通用头部

如何在 React Navigation createStackNavigator 中更改字体系列

如何重置react-native 动画?

错误:安装 react-native-elements 后无法识别字体系列 Material Design 图标?

props验证中缺少 React Navigation 'navigation'

React Native + Jest EMFILE:too many open files error

在Android上更改高度时react-native TextInput显示错误

React Native 检测点击 View

使用 Jest 的 react-navigation 测试组件

React Native onLayout 与 React Hooks

使用 React Navigation 导航堆栈时重新渲染组件

React Native Build Error on IOS - typedef 用不同类型重新定义('uint8_t'(又名'unsigned char')与'enum clockid_t')

当前未启用语法nullishCoalescingOperator

无法运行 jetifier React Native

如何在react-native中更新数组状态?

Flatlist getItemLayout 用例