react-navigation Modal弹出层中的StackNavigator导航如何和物理返回匹配?
带有StackNavigator的Modal弹出层
const StackReouteConfig = {
Login: {
screen: Login
},
Register: {
screen: Register
},
ForgetPassword: {
screen: ForgetPassword
}
}
const StackNavigatorConfigs = {
initialRouteName: "Login",
headerMode: "screen",
mode: "modal",
navigationOptions: {
headerStyle: {
}
}
}
const StackNavigator = createStackNavigator(StackReouteConfig, StackNavigatorConfigs);
const UserModalNavigator = createAppContainer(StackNavigator);
// 重写getStateForAction,防止重复跳转
const navigateOnce = (getStateForAction) => (action, state) => {
const {type, routeName, params} = action;
return (
state &&
(type === NavigationActions.NAVIGATE) &&
routeName === state.routes[state.routes.length - 1].routeName &&
JSON.stringify(params) === JSON.stringify(state.routes[state.routes.length - 1].params)
) ? null getStateForAction(action, state);
};
UserModalNavigator.router.getStateForAction = navigateOnce(UserModalNavigator.router.getStateForAction);
// 带有StackNavigator的弹出层
export default UserModal extends Component {
constructor(props) {
super(props);
this.state = {
visible: true //可以props传递
}
}
render() {
return (
<Modal
animationType={"slide"}
transparent={false}
visible={this.state.visible}
onRequestClose={() => {
// 判断是否是第一个
if(this._navigator.state.nav.index === 0) {
// 隐藏此Modal
} else {
// 返回上一页,栈回退
this._navigator.dispatch(
NavigationActions.back({
type: NavigationActions.BACK,
key: ""
})
)
}
}}
style={{backgroundColor: "#fff"}}>
<UserModalNavigator
ref={navigationRef => this._navigator = navigationRef}/>
</Modal>
)
}
}
几点说明:
this._navigator 是 UserModalNavigator组件,也就是 createAppContainer 方法返回的对象
createAppContainer 返回的对象 NavigationContainer 含有 router、screenProps、navigationOptions、state等属性
想要在没有navigation的情况下使用navigation:
1. 可以使用 withNavigation方法包裹组件,从而使得组件 能够使用 navigation的属性和方法
2. 使用 NavigationContainer 对象来重写navigation的方法,从而达到使用navigation的效果
如上面的代码:重写goBack()方法
this._navigator.dispatch(
NavigationActions.back({
type: NavigationActions.BACK,
key: ""
})
)
还有类似的
//重写navigate 方法
function navigate(routeName, params) {
_navigator && _navigator.dispatch(
NavigationActions.navigate({
type: NavigationActions.NAVIGATE,
routeName,
params
})
)
}
//重写reset方法
function reset(routeName, params) {
_navigator && _navigator.dispatch(
StackAction.reset({
index: 0,
actions: [NAvigationActions.navigate({ routeName: 'HomeScreen'})],
})
)
}
分类:
react native
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了