如何在 React Native 中同时重置导航堆栈时从子 Stack Navigator 导航回父级
How to navigate from a child Stack Navigator back to parent while resetting navigation stack at the same time, in React Native
我读过无数反应导航文档,我知道有办法做到这一点,但这绝对是我所说的非平凡且绝对非直观的。
我有一个根导航堆栈:
export const NavigationStack = StackNavigator({
Splash: {
screen: Splash
},
Signup: {
screen: Signup
},
Login: {
screen: SignIn
},
ForgottenPassword: {
screen: ForgottenPassword
},
Discover: {
screen: Discover
},
ProfileShow: {
screen: ProfileShow
}
}, {
headerMode: 'none'
})
ForgottenPassword 屏幕是一个子 Stack Navigator:
import { StackNavigator } from 'react-navigation'
import PasswordResetProcess from './index'
const ForgottenPassword = StackNavigator({
ResetPassword: {
screen: PasswordResetProcess
}
}, {
headerMode: 'none'
})
export default ForgottenPassword
在那个 index.js
容器组件上,有一个我将导航传递给的子组件,如下所示:
switch (lastCompletedStep) {
case NEW_RESET_REQUEST:
return <InputTel navigation={navigation} />
case INPUT_TEL:
return <ResetPassword navigation={navigation} />
那个 ResetPassword
组件就是有问题的组件。它触发动作创建器并将 this.props.navigation
传递给动作创建器:
await props.handleResetSubmit(token, props.navigation)
在此动作创建器中,props.navigation
可用作 navigation
。我可以做到这一点:
navigation.navigate('Discover') // see how this is from the root Navigation Stack
但是,我不能这样做:
navigation.dispatch({
type: 'Navigation/RESET',
index: 0,
actions: [{ type: 'Navigate', routeName: 'Discover' }]
})
它抛出这个错误:
[编辑] 我刚试过这个,它也产生了同样的错误:
navigation.dispatch(NavigationActions.reset({
index: 0,
actions: [NavigationActions.navigate({ routeName: 'Discover' })]
}))
How do I reset the stack while navigating to Discover
from here?
我觉得答案是在进行某种子操作的同时导航以发现和重置堆栈,但我不知道从哪里开始将它们放在一起。 react-navigation
说明子到父操作的文档太可怕了。
以下是我对它大概应该是什么样子的最佳猜测:
navigation.dispatch({
type: 'Navigation/NAVIGATE',
routeName: 'Discover',
actions: [{ type: 'Reset', index: 0, key: null }]
})
我刚刚用这段代码解决了它:
navigation.dispatch(NavigationActions.reset({
index: 0,
key: null,
actions: [NavigationActions.navigate({ routeName: 'Discover' })]
}))
秘诀是添加 key: null
,我以前见过有人这样做。当你重置的时候,这是一个非常重要的元素。
这是我找到的说明它的文档:
https://github.com/react-community/react-navigation/issues/1127
我认为这是可行的,因为 NavigationActions
了解根导航堆栈,所以它的工作原理与 navigation.navigate('Discover')
相同(在我的代码的上下文中)。这个问题。
在 React 导航的版本 >2 中,NavigationActions.reset() 不起作用。
您应该使用 StackActions.reset() 代替:
import { NavigationActions, StackActions } from 'react-navigation';
const resetStackAction = StackActions.reset({
index: 0,
actions: [NavigationActions.navigate({ routeName: 'Discover' })],
});
this.props.navigation.dispatch(resetStackAction);
我读过无数反应导航文档,我知道有办法做到这一点,但这绝对是我所说的非平凡且绝对非直观的。
我有一个根导航堆栈:
export const NavigationStack = StackNavigator({
Splash: {
screen: Splash
},
Signup: {
screen: Signup
},
Login: {
screen: SignIn
},
ForgottenPassword: {
screen: ForgottenPassword
},
Discover: {
screen: Discover
},
ProfileShow: {
screen: ProfileShow
}
}, {
headerMode: 'none'
})
ForgottenPassword 屏幕是一个子 Stack Navigator:
import { StackNavigator } from 'react-navigation'
import PasswordResetProcess from './index'
const ForgottenPassword = StackNavigator({
ResetPassword: {
screen: PasswordResetProcess
}
}, {
headerMode: 'none'
})
export default ForgottenPassword
在那个 index.js
容器组件上,有一个我将导航传递给的子组件,如下所示:
switch (lastCompletedStep) {
case NEW_RESET_REQUEST:
return <InputTel navigation={navigation} />
case INPUT_TEL:
return <ResetPassword navigation={navigation} />
那个 ResetPassword
组件就是有问题的组件。它触发动作创建器并将 this.props.navigation
传递给动作创建器:
await props.handleResetSubmit(token, props.navigation)
在此动作创建器中,props.navigation
可用作 navigation
。我可以做到这一点:
navigation.navigate('Discover') // see how this is from the root Navigation Stack
但是,我不能这样做:
navigation.dispatch({
type: 'Navigation/RESET',
index: 0,
actions: [{ type: 'Navigate', routeName: 'Discover' }]
})
它抛出这个错误:
navigation.dispatch(NavigationActions.reset({
index: 0,
actions: [NavigationActions.navigate({ routeName: 'Discover' })]
}))
How do I reset the stack while navigating to
Discover
from here?
我觉得答案是在进行某种子操作的同时导航以发现和重置堆栈,但我不知道从哪里开始将它们放在一起。 react-navigation
说明子到父操作的文档太可怕了。
以下是我对它大概应该是什么样子的最佳猜测:
navigation.dispatch({
type: 'Navigation/NAVIGATE',
routeName: 'Discover',
actions: [{ type: 'Reset', index: 0, key: null }]
})
我刚刚用这段代码解决了它:
navigation.dispatch(NavigationActions.reset({
index: 0,
key: null,
actions: [NavigationActions.navigate({ routeName: 'Discover' })]
}))
秘诀是添加 key: null
,我以前见过有人这样做。当你重置的时候,这是一个非常重要的元素。
这是我找到的说明它的文档:
https://github.com/react-community/react-navigation/issues/1127
我认为这是可行的,因为 NavigationActions
了解根导航堆栈,所以它的工作原理与 navigation.navigate('Discover')
相同(在我的代码的上下文中)。这个问题。
在 React 导航的版本 >2 中,NavigationActions.reset() 不起作用。 您应该使用 StackActions.reset() 代替:
import { NavigationActions, StackActions } from 'react-navigation';
const resetStackAction = StackActions.reset({
index: 0,
actions: [NavigationActions.navigate({ routeName: 'Discover' })],
});
this.props.navigation.dispatch(resetStackAction);