React Navigation 使用中遇到的问题小结


Posted in Javascript onMay 08, 2018

在React Native的开发中,使用到react navigation框架时遇到了不少问题。主要是安卓和iOS中相对不协调的地方,特此记录

一、Navigation Bar

使用navigationbar的时候遇到如下的问题

1.navigation bar的底部有一条黑线

本意做一个bar的颜色和页面颜色一致的页面。只有顶部有两个其他按钮的时候。发现bar的底部有一条黑线。导致bar不能很好的匹配想要的页面效果。在header中设置一下代码中后可去除

static navigationOptions = {
 ...
 headerStyle: {
    ...
    borderBottomWidth: 0,
  },
 }

2. android 的 Bar底部有一条阴影,自定义Bar背景图无法填充满

react navigation bar在安卓中默认会有一个高度。带来的视觉效果是底部会有一条阴影。而且造成另外一个比较头疼的效果是如果使用了带背景图的自定义Bar时。会发现背景图有覆盖不全的效果。两侧总有一些间隙。iOS中则不会出现此问题。将elevation属性置零后可解决这个问题

static navigationOptions = {
 ...
 headerStyle: {
    ...
    elevation: 0,
  },
 }

3.android 中Bar标题居中问题

在安卓中,bar 的标题是居左的。iOS则默认居中。可以通过以下写法居中

static navigationOptions = {
 ...
 headerTitleStyle: {
    //此属性是标题的Style属性。可以接受<Text>标签的style
    ...
    alignSelf: "center",
  },
 }

在左侧没有按键的时候。这样写就足够了。但是如果左侧有个返回键或者自定义的其他按键。在安卓中标题就会发生偏移。解决办法是右侧添加一个空按钮

static navigationOptions = {
 ...
 headerRight: <View />
 }

4.带背景图的Navgation Bar

与源生不同。react navigation bar中并没有背景图这一属性。也就是说我们要使用带背景图的navigation bar的时候必须要使用自定义的view。

import {Header} from "react-navigation";
//header 需导入
const ImageHeader = props => (
  <View>
    <Image
      style={{position: "absolute", zIndex: -1, width: "100%", height: "100%", resizeMode: "cover"}}
      source={require(...)}
    />
    <Header {...props} style={{backgroundColor: "transparent"}} />
  </View>
);

static navigationOptions = {
 ...
 headerStyle: {
   //背景颜色必须为透明,不然无法透出底部图片
   backgroundColor: "transparent",
   //安卓中不添加此属性会导致背景图无法铺满
   elevation: 0,
 },
  header: props => {
    return <ImageHeader {...props} />;
  },
 }

5.当StackNavigator与DrawerNavigator嵌套使用时手势冲突问题

当DrawerNavigator嵌套StackNavigator时。进入StackNav的二级界面后返回手势与打开DrawerNav打开菜单冲突。

static navigationOptions = {
 ...
 //禁止打开菜单
 drawerLockMode: "locked-closed", 
 //允许使用返回手势
 gesturesEnabled: true,
 }

此设置按照需求自行修改

5.Navgation Bar高度不一致问题

使用自定义的Bar时。安卓和iOS高度不一致。Android计算Nav高度是从手机顶部开始计算。而iOS默认会向下偏移状态栏的高度。要做到效果统一。需要将安卓的Bar的paddingTop属性设为状态栏高度

import {StatusBar, Platform} from "react-native";
navigationOptions = {
 ...
 headerStyle: {
   ...
   paddingTop: Platform.OS === "ios" ? 0 : StatusBar.currentHeight,
  },
 }

6.navigation Bar上使用自定义按钮

使用headerRight 或者 headerLeft 可以定制按钮或者View

static navigationOptions = {
 ...
 headerRight = (<TouchableOpacity style={{marginRight: 10}} onPress={...}>
        <Text style={styles.NavSureButton}>btn</Text>
      </TouchableOpacity>)
 }

但是如果onPress方法要用到this.props、this.state或者是类中的其他方法的时候就会出现问题

在每个页面的类中,我们使用static navigationOptions={...}来配置navigation的一些配置。但是由于static 修饰的属性属于类的静态属性。无法调用this的属性方法。所以我们需要使用this.props.navigation.setParams({key:value ...})方法来设置header按钮的点击事件。

class Demo extends React,Component{
 componentWillMount() {
  //绑定方法
  this.props.navigation.setParams({rightOnPress: this.rightBtnOnPress});
 }
 //点击方法
 rightBtnOnPress = ()=>{
  ...
 }
  static navigationOptions = ({navigation}) => {
    const params = navigation.state.params || {};
    let navigationOptions = {
    ...
    headerRight = (<TouchableOpacity style={{marginRight: 10}} onPress={params.rightOnPress}>
        <Text style={styles.NavSureButton}>btn</Text>
      </TouchableOpacity>)
    }
    return navigationOptions;
  };
  ...
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jquery的ajax从纯真网(cz88.net)获取IP地址对应地区名
Dec 02 Javascript
Jquery的hide及toggle方法让超链接慢慢消失
Sep 06 Javascript
jquery ajax jsonp跨域调用实例代码
Dec 11 Javascript
javascript实现在网页中运行本地程序的方法
Feb 03 Javascript
动手写一个angular版本的Message组件的方法
Dec 16 Javascript
原生JS实现的多个彩色小球跟随鼠标移动动画效果示例
Feb 01 Javascript
jQuery实现带右侧索引功能的通讯录示例【附源码下载】
Apr 17 jQuery
浅谈Vue render函数在ElementUi中的应用
Sep 06 Javascript
详解如何解决Vue和vue-template-compiler版本之间的问题
Sep 17 Javascript
webpack dll打包重复问题优化的解决
Oct 10 Javascript
Fundebug支持监控微信小程序HTTP请求错误的方法
Feb 21 Javascript
微信小程序 冒泡事件原理解析
Sep 27 Javascript
官方推荐react-navigation的具体使用详解
May 08 #Javascript
JavaScript callback回调函数用法实例分析
May 08 #Javascript
JavaScript累加、迭代、穷举、递归等常用算法实例小结
May 08 #Javascript
vue-cli 引入、配置axios的方法
May 08 #Javascript
vue axios 给生产环境和发布环境配置不同的接口地址(推荐)
May 08 #Javascript
JavaScript实现计算圆周率到小数点后100位的方法示例
May 08 #Javascript
Vue.js 实现微信公众号菜单编辑器功能(二)
May 08 #Javascript
You might like
浅析PHP文件下载原理
2014/12/25 PHP
yii2中添加验证码的实现方法
2016/01/09 PHP
CI框架源码解读之URI.php中_fetch_uri_string()函数用法分析
2016/05/18 PHP
php计算给定日期所在周的开始日期和结束日期示例
2017/02/06 PHP
CSS中一些@规则的用法小结
2021/03/09 HTML / CSS
使用正则替换变量
2007/05/05 Javascript
Prototype Number对象 学习
2009/07/19 Javascript
让你的博客飘雪花超出屏幕依然看得见
2013/01/04 Javascript
javascript实现的元素拖动函数宿主为浏览器
2014/07/21 Javascript
javascript单例模式的简单实现方法
2015/07/25 Javascript
JavaScript的模块化开发框架Sea.js上手指南
2016/05/12 Javascript
canvas绘制万花筒效果(代码分享)
2017/01/20 Javascript
AngularJS实现动态添加Option的方法
2017/05/17 Javascript
es6基础学习之解构赋值
2018/12/10 Javascript
JS高阶函数原理与用法实例分析
2019/01/15 Javascript
优雅的将ElementUI表格变身成树形表格的方法步骤
2019/04/11 Javascript
[01:01:01]完美世界DOTA2联赛循环赛 GXR vs FTD BO2第一场 10.29
2020/10/29 DOTA
Python开发的实用计算器完整实例
2017/05/10 Python
Python3网络爬虫之使用User Agent和代理IP隐藏身份
2017/11/23 Python
Python中 map()函数的用法详解
2018/07/10 Python
ipython和python区别详解
2019/06/26 Python
简单的Python调度器Schedule详解
2019/08/30 Python
详解用Python调用百度地图正/逆地理编码API
2020/07/02 Python
LA MER海蓝之谜美国官网:传奇面霜
2016/08/27 全球购物
瑞典度假品牌:OAS
2019/05/28 全球购物
Waterford英国官方网站:世界上最受欢迎的优质水晶品牌
2019/08/17 全球购物
体育纪念品、亲笔签名的体育收藏品:Steiner Sports
2020/07/31 全球购物
外国语学院毕业生自荐信
2013/10/28 职场文书
加拿大留学自荐信
2014/01/28 职场文书
反四风对照检查材料
2014/09/22 职场文书
运动会搞笑广播稿
2014/10/14 职场文书
2014年个人业务工作总结
2014/11/17 职场文书
学雷锋活动简报
2015/07/20 职场文书
2019经典广告词集锦!
2019/07/02 职场文书
创业计划书之餐饮
2019/09/02 职场文书
Python万能模板案例之matplotlib绘制直方图的基本配置
2022/04/13 Python