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 相关文章推荐
JavaScript窗口功能指南之在窗口中书写内容
Jul 21 Javascript
ExtJS下grid的一些属性说明
Dec 13 Javascript
javascript 同时在IE和FireFox获取KeyCode的代码
Feb 07 Javascript
js操作ajax返回的json的注意问题!
Feb 23 Javascript
js生成动态表格并为每个单元格添加单击事件的方法
Apr 14 Javascript
jQuery中多个元素的Hover事件解决方案
Jun 12 Javascript
js生成随机数的过程解析
Nov 24 Javascript
EasyUI Pagination 分页的两种做法小结
Jul 09 Javascript
vue中axios处理http发送请求的示例(Post和get)
Oct 13 Javascript
浅谈Node模块系统及其模式
Nov 17 Javascript
微信小程序如何再次获取用户授权的方法
May 10 Javascript
JavaScript 中for/of,for/in 的详细介绍
Nov 17 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横向重复区域显示二法
2008/09/25 PHP
php+javascript的日历控件
2009/11/19 PHP
打造超酷的PHP数据饼图效果实现代码
2011/11/23 PHP
php中spl_autoload详解
2014/10/17 PHP
YiiFramework入门知识点总结(图文教程)
2015/12/28 PHP
php 常用的系统函数
2017/02/07 PHP
jQuery帮助之CSS尺寸(五)outerHeight、outerWidth
2009/11/14 Javascript
节点的插入之append()和appendTo()的用法介绍
2014/01/13 Javascript
javascript图片预加载完整实例
2015/12/10 Javascript
Jsonp 关键字详解及json和jsonp的区别,ajax和jsonp的区别
2015/12/30 Javascript
JavaScript实现简洁的俄罗斯方块完整实例
2016/03/01 Javascript
Bootstrap的fileinput插件实现多文件上传的方法
2016/09/05 Javascript
最原始的jQuery注册验证方式
2016/10/11 Javascript
AngularJS Controller作用域
2017/01/09 Javascript
详解webpack性能优化——DLL
2017/10/20 Javascript
微信小程序将字符串生成二维码图片的操作方法
2018/07/17 Javascript
深入理解移动前端开发之viewport
2018/10/19 Javascript
Vue.Draggable拖拽功能的配置使用方法
2020/07/29 Javascript
javascript实现抢购倒计时程序
2019/08/26 Javascript
微信小程序实现音乐播放页面布局
2020/12/11 Javascript
[01:09:50]VP vs Pain 2018国际邀请赛小组赛BO2 第二场
2018/08/20 DOTA
Python基本数据类型详细介绍
2014/03/11 Python
解决pycharm下os.system执行命令返回有中文乱码的问题
2019/07/07 Python
Python进度条的制作代码实例
2019/08/31 Python
使用matplotlib绘制图例标签中带有公式的图
2019/12/13 Python
Tkinter中复选菜单是否被选中的判断与设置方式
2020/03/04 Python
python 读取、写入txt文件的示例
2020/09/27 Python
美国网上眼镜商城:Zenni Optical
2016/11/20 全球购物
函授本科自我鉴定
2014/02/04 职场文书
老公保证书范文
2014/04/29 职场文书
尊师重教演讲稿
2014/09/04 职场文书
单方离婚协议书范本2014
2014/10/28 职场文书
2015年采购工作总结
2015/04/10 职场文书
刑事辩护词范文
2015/05/21 职场文书
Java Shutdown Hook场景使用及源码分析
2021/06/15 Java/Android
Python可变与不可变数据和深拷贝与浅拷贝
2022/04/06 Python