React Native自定义导航栏
之前我们学习了可触摸组件和页面导航的使用的使用:
从零学React Native之09可触摸组件
…
从零学React Native之03页面导航
…
经过之前的学习, 我们可以完成一个自定义导航栏了, 效果如下:
我们需要创建一个 NaviBar.js
用来显示顶部的导航栏, 还需要四个界面(Page1.js,Page2.js,Page3.js,Page4.js
)。 当然还需要修改index.android.js
或者index.ios.js
用来处理4个界面的切换。
导航栏NaviBar 实现
这里, 我们就假设应用有4个栏目, 每个按钮的宽高比为 4:3
直接贴代码了:
import React, { Component } from 'react';
import {
AppRegistry,
StyleSheet,
View,
Text,
TouchableHighlight,
} from 'react-native';
var Dimensions = require("Dimensions");
var totalWidth = Dimensions.get('window').width;// 屏幕宽度
let naviButtonWidth = totalWidth / 4; //计算导航条每个宽度
let naviButtonHeight = naviButtonWidth * 0.75; // 导航条每个高度
export default class NaviBar extends Component {
// 构造
constructor(props) {
super(props);
this._tab0Pressed = this._tab0Pressed.bind(this);
this._tab1Pressed = this._tab1Pressed.bind(this);
this._tab2Pressed = this._tab2Pressed.bind(this);
this._tab3Pressed = this._tab3Pressed.bind(this);
}
//四个按钮 被按下时处理函数
_tab0Pressed() {
this.props.onNaviBarPress(0);
}
_tab1Pressed() {
this.props.onNaviBarPress(1);
}
_tab2Pressed() {
this.props.onNaviBarPress(2);
}
_tab3Pressed() {
this.props.onNaviBarPress(3);
}
render() {
//通过属性得知哪个导航按钮是当前导航页, 这个导航用灰色背景
//利用JavaScript数组的map函数,从一个数组对应生成另一个数组buttonColors
// 看不懂该函数的,看下面的解释
var buttonColors = this.props.naviBarStatus.map(function (aNumber) {
if (aNumber == 0) return 'white';
return 'gray';
});
return (
//根View
<View style={styles.naviRow}>
<TouchableHighlight onPress={this._tab0Pressed}>
<View style={[styles.button,{backgroundColor:buttonColors[0]}]}>
<Text style={styles.textStyle1}>
条目一
</Text>
</View>
</TouchableHighlight>
<TouchableHighlight onPress={this._tab1Pressed}>
<View style={[styles.button,{backgroundColor:buttonColors[1]}]}>
<Text style={styles.textStyle1}>
条目二
</Text>
</View>
</TouchableHighlight>
<TouchableHighlight onPress={this._tab2Pressed}>
<View style={[styles.button,{backgroundColor:buttonColors[2]}]}>
<Text style={styles.textStyle1}>
条目三
</Text>
</View>
</TouchableHighlight>
<TouchableHighlight onPress={this._tab3Pressed}>
<View style={[styles.button,{backgroundColor:buttonColors[3]}]}>
<Text style={styles.textStyle1}>
条目四
</Text>
</View>
</TouchableHighlight>
</View>
);
}
}
// 声明属性, 方便使用当前组件
NaviBar.propTypes = {
naviBarStatus: React.PropTypes.arrayOf(React.PropTypes.number).isRequired,
onNaviBarPress: React.PropTypes.func.isRequired
};
//样式
const styles = StyleSheet.create({
naviRow: {
flexDirection: 'row'
},
button: {
width: naviButtonWidth,
height: naviButtonHeight,
justifyContent: 'center'
},
textStyle1: {
fontSize: 20,
textAlign: 'center'
}
});
上面用到了, Map函数 ,
Map函数的作用是按照某种关系从原数组”映射”出新数组. 如下面求平方的例子:
var data= [1,2,3,4];
var newArray=data.map((item)=>{return item*item});
console.log(newArray); //输出[1,4,9,16]
统一处理四个界面的切换
我们需要在index.android.js 或者index.ios.js 这个代码比较简单, 只需要导入四个界面, 用Navigator组件切换就可以了。
import React, { Component } from 'react';
import {
AppRegistry,
StyleSheet,
Navigator
} from 'react-native';
import Page1 from './Page1';
import Page2 from './Page2';
import Page3 from './Page3';
import Page4 from './Page4';
class AwesomeProject extends Component {
//告知Navigator 模块切换时的效果
configureScene() {
return Navigator.SceneConfigs.FadeAndroid;
}
//根据传递的信息, 处理界面的切换
renderScene(router, navigator) {
this._navigator = navigator;
switch (router.name) {
case 'Page1':
return <Page1 navigator={navigator}/>;
case 'Page2':
return <Page2 navigator={navigator}/>;
case 'Page3':
return <Page3 navigator={navigator}/>;
case 'Page4':
return <Page4 navigator={navigator}/>;
}
}
render() {
return (
//根View
<Navigator
initialRoute={{name:'Page1'}}
configureScene={this.configureScene}
renderScene={this.renderScene}/>
);
}
}
AppRegistry.registerComponent('AwesomeProject', () => AwesomeProject);
界面
上面的代码需要引入Page1 - Page4, 这个四个界面非常相似, 我们只贴其中一个了.
Page1.js
import React, { Component } from 'react';
import {
View,
StyleSheet,
} from 'react-native';
import NaviBar from './NaviBar';
export default class Page1 extends Component {
// 构造
constructor(props) {
super(props);
// 初始状态
this.onNaviBarPress = this.onNaviBarPress.bind(this);
}
render() {
// 不同的Page,需要修改下面的这个数组, 通过数组控制导航栏条目显示状态
var naviStatus = [1, 0, 0, 0];
return (
<View style={styles.container}>
<NaviBar naviBarStatus={naviStatus}
onNaviBarPress={this.onNaviBarPress}/>
<View style={styles.whatLeft}/>
</View>
);
}
//不同的page需要修改返回值
onNaviBarPress(aNumber) {
switch (aNumber) {
case 0:
return;
case 1:
//通过replace切换
this.props.navigator.replace({
name: 'Page2'
});
return;
case 2:
this.props.navigator.replace({
name: 'Page3'
});
return;
case 3:
this.props.navigator.replace({
name: 'Page4'
});
return;
}
}
}
const styles = StyleSheet.create({
container: {
flex: 1
},
whatLeft: { // 组件定义了一个上边框
flex: 1,
borderTopWidth: 1,
borderColor: 'black',
backgroundColor:'red' //每个界面背景颜色不一样
}
});
顺便指出两点: 当根View没有指定背景色时, 默认值是一种灰色; 当子View没有指定背景色时,会继承父View的背景色。
更多精彩请关注微信公众账号likeDev,公众账号名称:爱上Android。
React Native自定义导航栏的更多相关文章
- [RN] React Native 自定义导航栏随滚动渐变
React Native 自定义导航栏随滚动渐变 实现效果预览: 代码实现: 1.定义导航栏 NavPage.js import React, {Component} from 'react'; im ...
- React Native自定义导航条
Navigator和NavigatorIOS 在开发中,需要实现多个界面的切换,这时候就需要一个导航控制器来进行各种效果的切换.在React Native中RN为我们提供了两个组件:Navigator ...
- React Native 之导航栏
一定要参考官网: https://reactnavigation.org/docs/en/getting-started.html 代码来自慕课网:https://www.imooc.com/cour ...
- React Native 底部导航栏
首先安装:npm install react-native-tab-navigator 然后再引入文件中 import TabNavigator from 'react-native-tab ...
- Taro多端自定义导航栏Navbar+Tabbar实例
运用Taro实现多端导航栏/tabbar实例 (H5 + 小程序 + React Native) 最近一直在捣鼓taro开发,虽说官网介绍支持编译到多端,但是网上大多数实例都是H5.小程序,很少有支持 ...
- 分别用ToolBar和自定义导航栏实现沉浸式状态栏
一.ToolBar 1.在build.gradle中添加依赖,例如: compile 'com.android.support:appcompat-v7:23.4.0' 2.去掉应用的ActionBa ...
- swift 自定义导航栏颜色
func setNavigationApperance(){ //自定义导航栏颜色 [self.navigationController?.navigationBar.barTintColor = U ...
- ios7以上自定义导航栏标题的字体大小及颜色的方法
自定义导航栏的字体和颜色,只需要自定义一个lable,然后将lable添加到导航栏的titleview中就可以了 代码如下 UILabel *label = [[UILabel alloc] init ...
- iOS 自定义导航栏笔记
一.UINavigationBar的结构 导航栏几乎是每个页面都会碰到的问题,一般两种处理方式:1.隐藏掉不显示 2.自定义 1. 添加导航栏 TestViewController * mainVC ...
随机推荐
- 【noip】跟着洛谷刷noip题2
noip好难呀. 上一个感觉有点长了,重开一个. 36.Vigenère 密码 粘个Openjudge上的代码 #include<cstdio> #include<iostream& ...
- 数组的方法之(Array.prototype.reduce() 方法)
reduce函数 reduce() 方法对累加器和数组中的每个元素(从左到右)应用一个函数,将其减少为单个值. 对数组中的所有元素调用指定的回调函数.该回调函数的返回值为累积结果,并且此返回值在下一次 ...
- Hackerrank--String Function Calculation(后缀数组)
题目链接 Jane loves string more than anything. She made a function related to the string some days ago a ...
- Spring AOP(转)
原文:Spring实现AOP的4种方式 Spring AOP 详解 Spring实现AOP的4种方式 先了解AOP的相关术语:1.通知(Advice):通知定义了切面是什么以及何时使用.描述了切面要完 ...
- Git.之.最小化配置
Git.之.最小化配置 做一个全局的用户配置,便于以后提交代码等,记录当前操作的用户. ## 添加配置 # git config [--local | --global | --system] use ...
- GYM 101981E(开关反转性质)
要点 做法是删去连续的k个0或k个1,连消.消消乐的那种,网上博主用个栈\(O(n)\)就很优秀地操作了这个过程 原因是有性质:比如k=3,101000贪心地翻就能翻成000101,所以连续的k个可以 ...
- 【扩展推荐】Laravel-ide-helper 高效的 IDE 智能提示插件 | Laravel China 社区 - 高品质的 Laravel 和 PHP 开发者社区 - Powered by PHPH
说明# barryvdh/laravel-ide-helper 扩展包能让你的 IDE ( PHPStorm, Sublime ) 实现自动完成.代码智能提示和代码跟踪等功能,大大提高你的开发效率. ...
- 阿里毕玄:来测试下你的Java编程能力
上篇整理了下后面准备更系统化写的Java编程进阶的思路,如果仅看里面的词,很多同学会觉得都懂,但我真心觉得没有多少人是真懂的,所以简单的想了一些题目,感兴趣的同学们可以来做做看,看看自己的Java编程 ...
- IIS 配置问题
1 IIS错误需要重新运行配置 重新注册.netframework. 解决方式:cmd C:\Windows\Microsoft.NET\Framework\v4.0.30319 aspnet_r ...
- 实践中了解到的CSS样式的优先级
CSS三大特性——继承.优先级和层叠.这是在精通CSS中重点强调的内容. 继承即子类元素继承父类的样式,常用的可继承样式有:color,font,line-height,list-style,text ...