视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
react-navigation在开发中的使用介绍
2020-11-27 19:33:13 责编:小采
文档


这篇文章给大家分享的内容是关于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: <PhoneHeader navigation={navigation}/>
 }
 )
 }
 }
 ),
 navigationOptions: {
 tabBarVisible: false,
 title: '机型'
 }
 },
 User: {
 screen: User,
 navigationOptions: {
 title: '我的'
 }
 }
 }
)

上面代码创建了包含3个tab的底部导航,其中phone的header是定制的。接下去我们要做的是配置在appNavigator中配置TabNavigatornavigation属性,根据不同的路由使用不同的header(即当处在home页或是user页时候,使用默认的header,当处在phone页面时,移除header

为什么是移除header?

因为phone页面已经自定义了header,我们只需移除外层TabNavigator的header即可。如果不然,会有2个header(TabNavigator和phone2个header)。这个上面已经提到。另外,也可以将定制的header配置在appNavigatorTabNavigatornavigation属性里。(未验证,可自行尝试。)

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事件系统的解析

下载本文
显示全文
专题