这篇文章给大家分享的内容是关于react-navigation在开发中的使用介绍,有一定的参考价值,有需要的朋友可以参考一下。
日常废话
react-navigation是一个来源于react社区的导航解决方案。 以我一个月资深的react开发经验来看,说是react-native开发app必备库之一毫不过分。
在开发过程中,不同页面因为不同的业务需求会有不同的头部(header),这篇文章针对几种常用我遇到过的各种header提供对应的react-navigation解决方案。
我是正文
底部tab对app来说是十分常见的需求。react-navigation也提供了相应的API来创建底部tab: createBottomTabNavigator
如何定制tab页的header呢? 我们分情况讨论:
所有tab页都要header
很简单,无需额外的配置。
所有tab页都不要header
第一时间可能会想到的是在createBottomTabNavigator中对每个页面的navigationOptions对象设置header为null。
createBottomTabNavigator( { Home: { screen: Home, navigationOptions: { header: null // 无效!! } } })
登录后复制
但实际上createBottomTabNavigator中的navigationOptions对象是不接受header参数的,至少文档中没写。官方文档
解决方式:在根级导航中设置。
const AppNavigator = createStackNavigator( { Main: { screen: TabNavigator, // TabNavigator就是通过createBottomTabNavigator创建的底部导航 navigationOptions: { header: null } } // other pages })
登录后复制
只有某个tab要header
其实navigator是可以互相嵌套的。 就像上面的例子中,Main路由的页面是createBottomTabNavigator创建的底部导航。同理,底部导航中某个tab的页面也可以是导航页。有点绕,还是看代码
const bottomTabNavigator = createBottomTabNavigator( { Home: { screen: Home, navigationOptions: { // some options } }, User: { // user页要"头"~ screen: createStackNavigator( User: { screen: User, navigationOptions: { header: customHeader } } ) } })const appNavigator = createStackNavigator( { Main: { screen: bottomTabNavigator, navigationOptions: { header: null // 这里要将bottomTabNavigator的header设为null } }, Other: { screen: Other } })
登录后复制
因为默认情况下bottomTabNavigator会有一个自己的header,而user我们又创建了一个带header的路由页面,所以我们将Main路由(bottomTabNavigato)的header设为null,如果不设置的,页面会有2个header哦,小伙伴可自行尝试。
某tab页不要header or 需要定制header
如果我只有某个tab页不要header,咋办?
还是从navigationOptions入手,navigationPptions属性可以是一个接受navigation对象,返回一个新对象的函数。
关于navigation对象,可以看官方文档
这里我们用到了该对象的state属性。
现在我们有如下导航配置:
const TabNavigator = createBottomTabNavigator( { Home: { screen: Home, navigationOptions: { title: '首页' } }, Phone: { screen: createStackNavigator( { Phone: { screen: Phone, navigationOptions: ({ navigation }) => ( { // phoneHeader为自定义React组件 header: } ) } } ), navigationOptions: { tabBarVisible: false, title: '机型' } }, User: { screen: User, navigationOptions: { title: '我的' } } })
登录后复制
上面代码创建了包含3个tab的底部导航,其中phone的header是定制的。接下去我们要做的是配置在appNavigator中配置TabNavigator的navigation属性,根据不同的路由使用不同的header(即当处在home页或是user页时候,使用默认的header,当处在phone页面时,移除header。
为什么是移除header?
因为phone页面已经自定义了header,我们只需移除外层TabNavigator的header即可。如果不然,会有2个header(TabNavigator和phone2个header)。这个上面已经提到。另外,也可以将定制的header配置在appNavigator中TabNavigator的navigation属性里。(未验证,可自行尝试。)
const AppNavigator = createStackNavigator( { Main: { screen: TabNavigator, navigationOptions: ({ navigation }) => { const titleMap = { Home: '首页', User: '我的' } // 根据路由的顺序以及路由名定义title const result = { title: titleMap[navigation.state.routes[navigation.state.index].routeName], headerTitleStyle: { fontWeight: '600', color: color.gray_1, fontSize: px2p(18) }, headerBackTitle: null } // 在配置TabNavigator时,phone页面是第一个定义的(zero-indexed)。 // 所以当index为1的时,header设为null // 或者将header设为自定义header,对应修改TabNavigator中phone。 if (navigation.state.index === 1) { result.header = null result.headerTransparent = true } return result } }, ...pages // 其他页面 }, { initialRouteName: 'Main' })
登录后复制
相关推荐:
对React事件系统的解析
以上就是react-navigation在开发中的使用介绍的详细内容,更多请关注【创想鸟】其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。
发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2745454.html