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 相关文章推荐
多个表单中如何获得这个文件上传的网址实现js代码
Mar 25 Javascript
JS定时器实例
Apr 17 Javascript
javascript常见用法总结
May 22 Javascript
javascript转换静态图片,增加粒子动画效果
May 28 Javascript
jQuery mobile在页面加载时添加加载中效果 document.ready 和window.onload执行顺序比较
Jul 14 Javascript
js实现上传图片预览方法
Oct 25 Javascript
AngularJS过滤器filter用法总结
Dec 13 Javascript
jQuery实现 RadioButton做必选校验功能
Jun 15 jQuery
JavaScript之事件委托实例(附原生js和jQuery代码)
Jul 22 jQuery
JS中原始值和引用值的储存方式示例详解
Mar 23 Javascript
如何在js代码中消灭for循环实例详解
Jul 29 Javascript
vue2 中二级路由高亮问题及配置方法
Jun 10 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中抽象类和抽象方法概念与用法分析
2016/05/24 PHP
Yii实现Command任务处理的方法详解
2016/07/14 PHP
Yaf框架封装的MySQL数据库操作示例
2019/03/06 PHP
懒就要懒到底——鼠标自动点击(含时间判断)
2007/02/20 Javascript
javascript实现的像java、c#之类的sleep暂停的函数代码
2010/03/04 Javascript
Jquey拖拽控件Draggable使用方法(asp.net环境)
2010/09/28 Javascript
利用jq让你的div居中的好方法分享
2013/11/21 Javascript
用IE重起计算机或者关机的示例代码
2014/03/10 Javascript
JavaScript中获取高度和宽度函数总结
2014/10/08 Javascript
Js中使用hasOwnProperty方法检索ajax响应对象的例子
2014/12/08 Javascript
浅谈JavaScript Date日期和时间对象
2014/12/29 Javascript
JS选项卡动态替换banner图片路径的方法
2015/05/11 Javascript
JavaScript实现下拉列表框数据增加、删除、上下排序的方法
2015/08/11 Javascript
javascript中活灵活现的Array对象详解
2016/11/30 Javascript
JS实现旋转木马轮播图
2020/01/01 Javascript
JavaScript装饰者模式原理与用法实例详解
2020/03/09 Javascript
[51:53]DOTA2-DPC中国联赛 正赛 RNG vs Dragon BO3 第二场 1月24日
2021/03/11 DOTA
[46:42]DOTA2-DPC中国联赛正赛 Aster vs Magma BO3 第二场 3月5日
2021/03/11 DOTA
python列表操作使用示例分享
2014/02/21 Python
Python3实现将文件归档到zip文件及从zip文件中读取数据的方法
2015/05/22 Python
Python第三方库xlrd/xlwt的安装与读写Excel表格
2017/01/21 Python
详解Python中的Numpy、SciPy、MatPlotLib安装与配置
2017/11/17 Python
用TensorFlow实现多类支持向量机的示例代码
2018/04/28 Python
Python3中在Anaconda环境下安装basemap包
2018/10/21 Python
django将网络中的图片,保存成model中的ImageField的实例
2019/08/07 Python
Python 使用matplotlib模块模拟掷骰子
2019/08/08 Python
python Event事件、进程池与线程池、协程解析
2019/10/25 Python
Numpy与Pytorch 矩阵操作方式
2019/12/27 Python
Python&amp;&amp;GDAL实现NDVI的计算方式
2020/01/09 Python
python_mask_array的用法
2020/02/18 Python
Christys’ Hats官网:英国帽子制造商
2018/11/28 全球购物
Stella McCartney官网:成衣、包袋、香水、内衣、童装及Adidas系列
2018/12/20 全球购物
离婚协议书的书写要求
2014/09/17 职场文书
2015年试用期工作总结
2014/12/12 职场文书
2015年个人剖析材料范文
2014/12/29 职场文书
2016新党章学习心得体会
2016/01/15 职场文书