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插件tipswindown与hintbox冲突
Nov 05 Javascript
JQuery一种取同级值的方式(比如你在GridView中)
Mar 15 Javascript
js/html光标定位的实现代码
Sep 23 Javascript
js创建对象的区别示例介绍
Jul 24 Javascript
vue之将echart封装为组件
Jun 02 Javascript
vue slots 组件的组合/分发实例
Sep 06 Javascript
JS栈stack类的实现与使用方法示例
Jan 31 Javascript
ES6小技巧之代替lodash
Jun 07 Javascript
JavaScript Dom 绑定事件操作实例详解
Oct 02 Javascript
JQuery省市联动效果实现过程详解
May 08 jQuery
vue路由权限校验功能的实现代码
Jun 07 Javascript
vue如何使用模拟的json数据查看效果
Mar 31 Vue.js
官方推荐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和javascript之间变量的传递实现代码
2012/12/19 PHP
PHP发送短信代码分享
2015/08/11 PHP
PHP的Laravel框架中使用消息队列queue及异步队列的方法
2016/03/21 PHP
IE6背景图片不缓存问题解决方案及图片使用策略多个方法小结
2012/05/14 Javascript
js实现对table动态添加、删除和更新的方法
2015/02/10 Javascript
javascript中 try catch用法
2015/08/16 Javascript
JQuery实现图片轮播效果
2015/09/15 Javascript
手机端图片缩放旋转全屏查看PhotoSwipe.js插件实现
2016/08/25 Javascript
用move.js库实现百叶窗特效
2017/02/08 Javascript
AngularJS通过ng-Img-Crop实现头像截取的示例
2017/08/17 Javascript
js实现本地时间同步功能
2017/08/26 Javascript
微信小程序实现漂亮的弹窗效果
2020/05/26 Javascript
javaScript实现游戏倒计时功能
2018/11/17 Javascript
在vue中使用jsonp进行跨域请求接口操作
2020/10/29 Javascript
python中map、any、all函数用法分析
2015/04/21 Python
Python的网络编程库Gevent的安装及使用技巧
2016/06/24 Python
python爬虫获取多页天涯帖子
2018/02/23 Python
pandas 根据列的值选取所有行的示例
2018/11/07 Python
解决pycharm运行出错,代码正确结果不显示的问题
2018/11/30 Python
使用Django连接Mysql数据库步骤
2019/01/15 Python
Python3.7安装keras和TensorFlow的教程图解
2020/06/18 Python
关于Tensorflow分布式并行策略
2020/02/03 Python
详解基于Scrapy的IP代理池搭建
2020/09/29 Python
appium+python自动化配置(adk、jdk、node.js)
2020/11/17 Python
python+selenium实现12306模拟登录的步骤
2021/01/21 Python
里程积分管理买卖交换平台:Points.com
2017/01/13 全球购物
学生会离职感言
2014/02/11 职场文书
《影子》教学反思
2014/02/21 职场文书
卫生院健康教育实施方案
2014/06/07 职场文书
秋季运动会演讲稿
2014/09/16 职场文书
民用住房租房协议书
2014/10/29 职场文书
先进教师个人总结
2015/02/11 职场文书
干货!开幕词的写作方法
2019/04/02 职场文书
2019新员工心得体会
2019/06/25 职场文书
MySql存储过程之逻辑判断和条件控制
2021/05/26 MySQL
canvas实现贪食蛇的实践
2022/02/15 Javascript