我正在尝试使用react-navigation创建一个没有tabbar和header的初始LOGIN屏幕,一旦用户成功通过身份验证,就会导航到另一个名为LISTRECORD的屏幕,该屏幕有一个tabbar,header和no back按钮选项 . 任何人都有这方面的经验,可以分享?
总之,我试图用反应导航实现的目标如下所述......
屏幕1:登录屏幕(无 Headers 和标签栏)
经过身份验证...
屏幕2:LISTRECORD( Headers ,标签栏和无后退按钮)
标签栏还包含其他标签,用于导航到屏幕3,屏幕4 ...
10 回答
使tabbar和header成为单独的组件,并仅将它们包含在其他组件中 . 关于禁用"BACK",文档中有一个关于"blocking navigation actions"的部分:https://reactnavigation.org/docs/routers/
您应该能够将其用于屏幕2 .
如果您不想从LIST页面到LOGIN页面的后退按钮,您可以这样做:
这是我基于@parker recommendation的解决方案:
创建顶级导航器,它应该是呈现登录屏幕的堆栈导航器 .
此顶级导航器中的另一个屏幕应该是您的应用程序的主导航器 .
满足登录状态时,将主堆栈重置为主导航器 .
这段代码完全可以完成上述任务 .
创建一个新的react-native项目,然后将下面的代码复制到index.ios.js和/或index.android.js中以查看它是否正常工作 .
我知道我在这里已经老了,但是这篇文章救了我的屁股,我在导航中处于地狱状态,现在我感觉更加舒适 .
That guy is explaining the internal API that will allows you to build your navigation as exactly as you imagine ,也使用主堆栈导航器 .
It goes deep with an authentication example
https://hackernoon.com/a-comprehensive-guide-for-integrating-react-navigation-with-redux-including-authentication-flow-cb7b90611adf
请拍这个家伙:-)
虽然Manjeet认为会起作用,但它并不是一个好的导航结构 .
你应该做的是退后一步,处理另一个层面的一切 .
顶级导航器应该是呈现登录屏幕的堆栈导航器 . 这个最顶级导航器中的另一个屏幕应该是您的应用程序的主导航器 . 满足登录状态后,将主堆栈重置为Main-Navigator .
这种结构的原因是:
A-如果您需要在登录未来之前添加入职信息,该怎么办?
B-如果您需要在主导航环境之外导航(例如:您的主导航是标签并且您想要非标签视图),该怎么办?
如果您的最顶层导航器是一个显示登录屏幕和其他导航器的Stack-Navigator,那么您的应用程序的导航结构可以正确缩放 .
我不相信如上所述,登录屏幕或堆栈导航器的条件渲染是一个好主意....相信我......我走了那条路 .
这就是我实现这一功能的方式 .
文件0)index.android.js
文件1)我的Root.js
2)App.js
3)AppNavigator.js
export const AppBeforeLogin = StackNavigator(routesConfig); //登录前的naviagtor
index.js
src/App.js (这是最重要的文件,因为它将所有碎片整合在一起)
src/navigation/nav_reducer.js
src/store/index.js
src/reducers.js
src/components/Auth/SignUpForm.js
我会在这里给你看一个例子 . 这不是我的,我只是在这个摇摇晃晃的StackOverflow编辑器中输入它 . 如果你欣赏它,请给我竖起大拇指:)
src/components/Auth/LoginForm.js
我会用超级涂料后退按钮向你展示一种愚蠢的款式
src/components/Auth/Splash.js
这是一个你可以玩的闪屏 . 我正在使用它像一个更高阶的组件:
src/components/Auth/login_actions.js
我将向您展示initializeApp(),以便您获得一些想法:
在其他用例中,您可能更喜欢高阶组件 . 它们的工作方式与React for web完全相同 . 斯蒂芬格里德关于Udemy的教程是最好的时期 .
src/HOC/require_auth.js
你就像这样使用它:
在那里,这就是我希望有人告诉并向我展示的一切 .
[编辑]这是我的退出动作创建者 . 如果您希望擦除导航堆栈以便用户无法按下Android硬件后退按钮并返回需要身份验证的屏幕,您会发现它非常有用:
如果要从其中一个子Stack Navigators导航并重置堆栈,请执行以下操作:
在添加代码的组件内部,您可以使用
this.props.navigation
制作像
<Something />
这样的组件将导航传递给它,如下所示:
<Something navigation={this.props.navigation} />
进入该组件的代码
请注意您在此子组件中如何使用
this.props.navigation
现在你已经完成了,只需拨打
this.props.navigation.navigate('OtherStackScreen')
就可以看到React Native神奇地去那里没有问题调用动作创建者或类似的东西(从第6步开始):
this.props.handleSubmit(data, this.props.navigation)
进入动作创建者并观察可能存在的代码:
actionCreators.js
我在企业级React Native应用程序中使用此代码,它工作得很漂亮 .
react-navigation
就像函数式编程一样 . 它被设计成以小的"pure navigation"片段处理,这些片段组合在一起 . 如果您采用上述策略,您将发现自己创建可重复使用的导航逻辑,您可以根据需要粘贴它 .现在反应导航网站about the authentication flow上有很好的文档 .
react-navigation
现在有一个SwitchNavigator,它有助于在导航器之间进行所需的行为和切换 . 目前没有太多关于它的文档,但是库创建了一个非常好的示例小吃,它显示了一个简单的认证流程实现 . 你可以查一下here .来自docs的示例
很好的是,您正在使用react-navigation,它可以很好地支持您的应用程序所需的大多数功能 . 继承人我的建议
1) On Authentication
React-native具有这个很好的功能状态变量,当重新呈现更改的视图时 . 您可以使用状态变量来了解应用用户的"state"(经过身份验证/访问者) .
这是一个简单的实现,用户通过按登录按钮登录
用户登录的输入页面
2) Login with header
登录视图
请记住在登录界面中删除样式属性并添加包括导入在内的样式属性,我将它们留在那里,因为它可以帮助您了解如何安排您的反应项目
但是它仍然可以在没有样式的情况下工作,因此您可以将它们关闭,单击登录按钮将转到主屏幕,因为状态已更改且视图必须根据新状态重新呈现
The login screen is without a header as you required
主屏幕带标签
3) Tabs with header 实现此功能的一般方法是在
StackNavigator
中添加TabNavigator
.Disclaimer : 代码可能会返回错误,因为某些文件可能丢失或者可能存在某些拼写错误,您应仔细检查详细信息,并在需要复制此代码时更改必要的位置 . 任何问题都可以粘贴为评论 . 希望这有助于某人 .
您也可以删除选项卡配置中的图标或安装react-native-vector图标,这样可以使选项卡变得更好!