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 相关文章推荐
Ajax提交与传统表单提交的区别说明
Feb 07 Javascript
jQuery 鼠标经过(hover)事件的延时处理示例
Apr 14 Javascript
js结合正则实现国内手机号段校验
Jun 19 Javascript
js实现固定显示区域内自动缩放图片的方法
Jul 18 Javascript
基于javascript实现样式清新图片轮播特效
Mar 30 Javascript
浅谈JavaScript 执行环境、作用域及垃圾回收
May 31 Javascript
js禁止表单重复提交
Aug 29 Javascript
使用Vuex实现一个笔记应用的方法
Mar 13 Javascript
JavaScript 日期时间选择器一些小结
Apr 02 Javascript
微信小程序实现的一键拨号功能示例
Apr 24 Javascript
vue实现树形结构样式和功能的实例代码
Oct 15 Javascript
vue-cli基础配置及webpack配置修改的完整步骤
Oct 20 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(5) 类和对象
2010/02/16 PHP
PHP 万年历实现代码
2012/10/18 PHP
实例讲解php数据访问
2016/05/09 PHP
图片自动缩小的js代码,用以防止图片撑破页面
2007/03/12 Javascript
JS的事件绑定深入认识
2014/06/26 Javascript
web前端设计师们常用的jQuery特效插件汇总
2014/12/07 Javascript
把Node.js程序加入服务实现随机启动
2015/06/25 Javascript
jquery实现倒计时效果
2015/12/14 Javascript
jQuery插件之jQuery.Form.js用法实例分析(附demo示例源码)
2016/01/04 Javascript
基于jQuery实现弹出可关闭遮罩提示框实例代码
2016/07/18 Javascript
js从外部获取图片的实现方法
2016/08/05 Javascript
基于angularJS的表单验证指令介绍
2016/10/21 Javascript
Javascript 数组去重的方法(四种)详解及实例代码
2016/11/24 Javascript
微信小程序 页面跳转传递值几种方法详解
2017/01/12 Javascript
js获取css的各种样式并且设置他们的方法
2017/08/22 Javascript
seaJs使用心得之exports与module.exports的区别实例分析
2017/10/13 Javascript
bootstrap表格内容过长时用省略号表示的解决方法
2017/11/21 Javascript
vue element-ui 绑定@keyup事件无效的解决方法
2018/03/09 Javascript
nodeJS进程管理器pm2的使用
2019/01/09 NodeJs
微信小程序五子棋游戏AI实现方法【附demo源码下载】
2019/02/20 Javascript
详解Vue中组件的缓存
2019/04/20 Javascript
vue中获取滚动table的可视页面宽度调整表头与列对齐(每列宽度不都相同)
2019/08/17 Javascript
解决Vue调用springboot接口403跨域问题
2019/09/02 Javascript
layer弹出层倒计时关闭的实现方法
2019/09/27 Javascript
微信小程序学习总结(二)样式、属性、模板操作分析
2020/06/04 Javascript
vue 动态组件(component :is) 和 dom元素限制(is)用法说明
2020/09/04 Javascript
python2.7安装图文教程
2018/03/13 Python
Python描述数据结构学习之哈夫曼树篇
2020/09/07 Python
英国最大的高品质珠宝和手表专家:Goldsmiths
2017/03/11 全球购物
ECOSUSI官网:女式皮革背包
2019/09/27 全球购物
师范学院教师自荐书
2014/01/31 职场文书
企业演讲稿范文大全
2014/05/20 职场文书
志愿者宣传口号
2014/06/17 职场文书
2014年音乐教师工作总结
2014/12/03 职场文书
工程部文员岗位职责
2015/02/04 职场文书
MySQL复制问题的三个参数分析
2021/04/07 MySQL