React Native的Navigator详解
来自Leo的原创博客,转载请著名出处 我的stackoverflow 前言
文档目前的文档都可以在这里找到,这里我列出常用的部分。 常用参数
(route,routeStack) => Navigator.SceneConfigs.FloatFromRight
常用函数
Getting start创建一个工程,打开终端,到一个想要的路径,然后 react-native init LHWeather --verbose
react-native run-ios
会启动模拟器,如果启动成功,说明项目创建成功。 我们首先会创建一个这样效果工程 var React = require('react');
import {
View,Text,StyleSheet,AppRegistry,TouchableHighlight,Navigator,} from 'react-native';
var LHWeather = React.createClass({
render(){
return (
<Navigator
style = {styles.container}
initialRoute={{id:"main",}}
renderScene={this.renderNav}
/>
);
},renderNav(route,nav){
switch (route.id) {
case 'main':
return <MainScreen navigator={nav} title="Main"/ >;
case 'detail':
return (<DetailScreen navigator={nav} title="Detail"/ >);
}
}
});
var MainScreen = React.createClass({
toDetail(){
this.props.navigator.push({id:"detail"});
},render(){
return (
<View style={styles.containView}>
<TouchableHighlight
style={styles.button}
onPress={this.toDetail}
underlayColor="#B5B5B5">
<Text style={styles.blackText}>=>详情页</Text>
</TouchableHighlight>
</View>
);
}
});
var DetailScreen = React.createClass({
toMain(){
this.props.navigator.pop();
},render(){
return (
<View style={styles.detailContainView}>
<TouchableHighlight
style={styles.button}
onPress={this.toMain}
underlayColor="green">
<Text style={styles.blackText}>{'主页<='}</Text>
</TouchableHighlight>
</View>
);
}
});
const styles = StyleSheet.create({
container: {
flex: 1,},button: {
padding: 15,containView:{
flex: 1,justifyContent: 'center',detailContainView:{
flex:1,backgroundColor:'green',blackText:{
fontSize:20,textAlign:'center',});
AppRegistry.registerComponent('LHWeather',() => LHWeather);
简单讲解下关于 <Navigator
style = {styles.container}
initialRoute={{id:"main",}}
renderScene={this.renderNav}
/>
renderNav(route,nav){
switch (route.id) {
case 'main':
return <MainScreen navigator={nav} title="Main"/ >;
case 'detail':
return (<DetailScreen navigator={nav} title="Detail"/ >);
}
}
设置转场动画类型和手势讲上文的Navigator修改成如下 <Navigator style = {styles.container} initialRoute={{id:"main",}} renderScene={this.renderNav} configureScene={(route, routeStack) => Navigator.SceneConfigs.FloatFromBottom} />
这样,转场动画会变成从底部推到顶部。可选的参数如下 Navigator.SceneConfigs.PushFromRight (default)
Navigator.SceneConfigs.FloatFromRight
Navigator.SceneConfigs.FloatFromLeft
Navigator.SceneConfigs.FloatFromBottom
Navigator.SceneConfigs.FloatFromBottomAndroid
Navigator.SceneConfigs.FadeAndroid
Navigator.SceneConfigs.HorizontalSwipeJump
Navigator.SceneConfigs.HorizontalSwipeJumpFromRight
Navigator.SceneConfigs.VerticalUpSwipeJump
Navigator.SceneConfigs.VerticalDownSwipeJump
添加导航栏为Navigator继续添加一个导航栏 <Navigator style = {styles.container} initialRoute={{id:"main",title:"Main"}} renderScene={this.renderNav} configureScene={(route, routeStack) => Navigator.SceneConfigs.HorizontalSwipeJump} navigationBar={ <Navigator.NavigationBar routeMapper={NavigationBarRouteMapper} style={styles.navBar} /> } />
这里提到了另外一个控件
这里的 var NavigationBarRouteMapper = {
//左边Button
LeftButton: function(route,navigator,index,navState) {
if (route.id === 'main') {
return null;
}
var previousRoute = navState.routeStack[index - 1];
return (
<TouchableOpacity
onPress={() => navigator.pop()}
style={styles.navBarLeftButton}>
<Text style={[styles.navBarText,styles.navBarButtonText]}>
{previousRoute.title}
</Text>
</TouchableOpacity>
);
},//右边Button
RightButton: function(route,navState) {
if (route.id === 'detail') {
return null;
}
return (
<TouchableOpacity
onPress={() => navigator.push({id:'detail',title:'Detail'})}
style={styles.navBarRightButton}>
<Text style={[styles.navBarText,styles.navBarButtonText]}>
Next
</Text>
</TouchableOpacity>
);
},//标题
Title: function(route,navState) {
return (
<Text style={[styles.navBarText,styles.navBarTitleText]}>
{route.title}
</Text>
);
},};
同时,要在StylesSheet中添加用到的Style navBar: { backgroundColor: 'white',},navBarText: { fontSize: 16,marginVertical: 10,navBarTitleText: { color: '#373E4D',fontWeight: '500',marginVertical: 9,navBarLeftButton: { paddingLeft: 10,navBarRightButton: { paddingRight: 10,navBarButtonText: { color: '#5890FF',
并且import中添加 TouchableOpacity, 这时候的效果如下 添加返回图片到这里就很简单了,只需要在LeftButton中换成显示一张图片 navBarLeftButton: { paddingLeft: 10,paddingTop:6,
然后,添加一个Style backImage:{ width:13,height:26,
修改LeftButton <TouchableOpacity onPress={() => navigator.pop()}
style={styles.navBarLeftButton}>
<Image source={require('./back.png')} style={styles.backImage}>
</Image>
</TouchableOpacity>
传递数据 toDetail(){
this.props.navigator.push({id:"detail",title:"Detail",data:"Passed from Main screen"});
},
然后,渲染的时候,传递data给DetailScreen的props case 'detail':
return (<DetailScreen navigator={nav} title="Detail" data={route.data}/>);
然后,获取数据,进行渲染 Text style={styles.blackText}>{this.props.data}</Text>
最后附上完整代码 /**
* Sample React Native App
* https://github.com/facebook/react-native
* @flow
*/
var React = require('react');
import {
View,TouchableOpacity,Image,} from 'react-native';
var NavigationBarRouteMapper = {
LeftButton: function(route,navState) {
if (route.id === 'main') {
return null;
}
var previousRoute = navState.routeStack[index - 1];
return (
<TouchableOpacity
onPress={() => navigator.pop()}
style={styles.navBarLeftButton}>
<Image source={require('./back.png')} style={styles.backImage}>
</Image>
</TouchableOpacity>
);
},RightButton: function(route,navState) {
if (route.id === 'detail') {
return null;
}
return (
<TouchableOpacity
onPress={() => navigator.push({id:'detail',title:'Detail'})}
style={styles.navBarRightButton}>
<Text style={[styles.navBarText,Title: function(route,navState) {
return (
<Text style={[styles.navBarText,};
var LHWeather = React.createClass({
render(){
return (
<Navigator
style = {styles.container}
initialRoute={{id:"main",title:"Main"}}
renderScene={this.renderNav}
configureScene={(route,routeStack) => Navigator.SceneConfigs.HorizontalSwipeJump}
navigationBar={
<Navigator.NavigationBar
routeMapper={NavigationBarRouteMapper}
style={styles.navBar}
/>
}
/>
);
},nav){
switch (route.id) {
case 'main':
return <MainScreen navigator={nav} title="Main"/ >;
case 'detail':
return (<DetailScreen navigator={nav} title="Detail" data={route.data}/>);
}
}
});
var MainScreen = React.createClass({
toDetail(){
this.props.navigator.push({id:"detail",title:"Detail",data:"Passed from Main screen"});
},render(){
return (
<View style={styles.detailContainView}>
<TouchableHighlight
style={styles.button}
onPress={this.toMain}
underlayColor="green">
<Text style={styles.blackText}>{this.props.data}</Text>
</TouchableHighlight>
</View>
);
}
});
const styles = StyleSheet.create({
backImage:{
width:13,height:26,container: {
flex: 1,navBar: {
backgroundColor: 'white',backgroundColor:'gray',navBar: {
backgroundColor: 'white',navBarText: {
fontSize: 16,marginVertical: 10,navBarTitleText: {
color: '#373E4D',fontWeight: '500',marginVertical: 9,navBarLeftButton: {
paddingLeft: 10,paddingTop:6,navBarRightButton: {
paddingRight: 10,navBarButtonText: {
color: '#5890FF',});
AppRegistry.registerComponent('LHWeather',() => LHWeather);
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |