react-navigation在开发中的使用介绍

这篇文章给大家分享的内容是关于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

(0)
上一篇 2025年3月8日 03:45:02
下一篇 2025年3月8日 03:45:07

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • 如何使用node生成验证码

    这篇文章给大家分享的内容是关于如何使用node生成验证码,有一定的参考价值,有需要的朋友可以参考一下。 前言 网络安全始终是一个重要话题,比如当你发现有人在恶意请求你的网站的邮箱注册接口,那么你可以考虑在服务端加上验证码,提高网站的安全性,…

    2025年3月8日
    200
  • js二次封装数组的使用介绍(代码)

    本篇文章分享给大家的内容是关于js数据结构二次封装我们的数组 ,内容很详细,接下来我们就来看看具体的内容,希望可以帮助到大家。 一、新建一个myArray类 class myArray { } 登录后复制 二、在这个类上初始化构造函数 /*…

    编程技术 2025年3月8日
    200
  • TypeScrip的重新改造问题以及解决问题的方案

    本篇文章分享给大家的内容是关于typescript改造问题与解决方案,内容很详细,接下来我们就来看看具体的内容,希望可以帮助到大家。 概述 由于本次改造的项目为一个通过NPM进行发布的基础服务包,因此本次采用TypeScript进行改造的目…

    编程技术 2025年3月8日
    200
  • 对Element UI table组件的源码的详细分析

    本文章从如下图所示的最基本的table入手,分析table组件源代码。本人已经对table组件原来的源码进行削减。本文只对重要的代码片段进行讲解,推荐下载代码把项目运行起来,跟着文章的思路阅读。 思路 登录后复制 table、table-h…

    2025年3月8日
    200
  • 如何使用Selectize.js插件来处理tag输入控件

    本篇文章分享给大家的内容是关于如何使用selectize.js插件来处理tag输入控件,内容很详细,接下来我们就来看看具体的内容,希望可以帮助到大家。 本来处理tags输入控件是很多的,比如select2,又比如chosen,都各有各的好处…

    2025年3月8日
    200
  • 如何快速构建一个web测试项目?

    本篇文章分享给大家的内容是关于如何快速构建一个web测试项目?内容很详细,接下来我们就来看看具体的内容,希望可以帮助到大家。 单纯的运行一段js逻辑的话就不需要构建测试项目,直接写个js,node命令行运行一下就可以了,但是往往阅读一段他人…

    编程技术 2025年3月8日
    200
  • vue2仿美团外卖的项目开发过程

    本篇文章分享给大家的内容是关于vue2仿美团外卖的项目开发过程,内容很详细,接下来我们就来看看具体的内容,希望可以帮助到大家。 前言 很多初学者尤其是像我这样的公司有且只有一个前端的时候,硬着头皮去学习一门新框架,周围无人帮忙,平日里遇到问…

    编程技术 2025年3月8日
    200
  • vue.js如何实现树形表格的封装?vue.js实现树形表格的方法

    本篇文章分享给大家的内容是关于vue.js如何实现树形表格的封装?vue.js实现树形表格的方法,内容很详细,接下来我们就来看看具体的内容,希望可以帮助到大家。 主要技术点:vue子组件的递归实现及相关样式的实现 树形表格实现 效果图(De…

    2025年3月8日
    200
  • 巧谈javaScript事件中event的两个公共成员:属性和方法

    dom中的event的公共成员包括属性和方法,触发的事件类型不一样,可用的属性和方法不一样。但是,dom中所有事件都有公共成员。这篇文章主要介绍了javascript事件中event的公共成员(属性和方法)非常不错,具有参考借鉴价值,需要的…

    2025年3月8日 编程技术
    200
  • 精讲js构造函数的继承方法及利弊(代码全)

    这篇文章主要介绍构造函数的继承(类的继承),同样包括 es5 和 es6 两部分的介绍,能力所限,文中难免有不合理或错误的地方,还望各位大神批评指正~ js构造函数 原型 首先简单介绍一下实例属性/方法 和 原型属性/方法,以便更好理解下文…

    2025年3月8日
    200

发表回复

登录后才能评论