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 相关文章推荐
XMLHTTP 乱码的解决方法(UTF8,GB2312 编码 解码)
Jan 12 Javascript
JS实现清除指定cookies的方法
Sep 20 Javascript
JavaScript 实现打印,打印预览,打印设置
Dec 30 Javascript
JavaScript中的闭包
Feb 24 Javascript
javascript时间差插件分享
Jul 18 Javascript
Bootstrap实现input控件失去焦点时验证
Aug 04 Javascript
jQuery 表单序列化实例代码
Jun 11 jQuery
JavaScript之DOM_动力节点Java学院整理
Jul 03 Javascript
在vue中获取dom元素内容的方法
Jul 10 Javascript
详解如何配置vue-cli3.0的vue.config.js
Aug 23 Javascript
深入理解基于vue-cli的webpack打包优化实践及探索
Oct 14 Javascript
javascript实现商品图片放大镜
Nov 28 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 XPath对XML文件查找及修改实现代码
2011/07/27 PHP
fetchAll()与mysql_fetch_array()的区别详解
2013/06/05 PHP
CodeIgniter生成网站sitemap地图的方法
2013/11/13 PHP
php之readdir函数用法实例
2014/11/13 PHP
php类自动加载器实现方法
2015/07/28 PHP
php基于自定义函数记录log日志方法
2017/07/21 PHP
javascript 当前日期加(天、周、月、年)
2009/08/09 Javascript
js关闭父窗口时关闭子窗口
2013/04/01 Javascript
window resize和scroll事件的基本优化思路
2014/04/29 Javascript
遮罩层点击按钮弹出并且具有拖动和关闭效果(两种方法)
2015/08/20 Javascript
JS在一定时间内跳转页面及各种刷新页面的实现方法
2016/05/26 Javascript
下一代Bootstrap的5个特点 超酷炫!
2016/06/17 Javascript
简单理解vue中track-by属性
2016/10/26 Javascript
ES6学习教程之对象的扩展详解
2017/05/02 Javascript
通过源码分析Vue的双向数据绑定详解
2017/09/24 Javascript
js防抖和节流的深入讲解
2018/12/06 Javascript
js对象数组和对象的使用实例详解
2019/08/27 Javascript
vue之a-table中实现清空选中的数据
2019/11/07 Javascript
js事件机制----捕获与冒泡机制实例分析
2020/05/22 Javascript
js实现双色球效果
2020/08/02 Javascript
Python随机生成均匀分布在单位圆内的点代码示例
2017/11/13 Python
python+matplotlib实现鼠标移动三角形高亮及索引显示
2018/01/15 Python
python得到qq句柄,并显示在前台的方法
2018/10/14 Python
python如何制作缩略图
2019/04/30 Python
使用python判断jpeg图片的完整性实例
2019/06/10 Python
python 实现兔子生兔子示例
2019/11/21 Python
python实现拼接图片
2020/03/23 Python
Python+logging输出到屏幕将log日志写入文件
2020/11/11 Python
结合CSS3的布局新特征谈谈常见布局方法
2016/01/22 HTML / CSS
html5版canvas自由拼图实例
2014/10/15 HTML / CSS
美国领先的商务贺卡出版商:The Gallery Collection
2018/02/13 全球购物
解释一下Windows的消息机制
2014/01/30 面试题
教师求职自荐信
2014/03/09 职场文书
体操比赛口号
2014/06/10 职场文书
模范教师材料大全
2014/12/16 职场文书
小学二年级语文教学反思
2016/03/03 职场文书