3.1 View组件
React Native中的View就相当于web开发容器中的div
3.1.1 View介绍
View是一个容器,支持flexbox布局,可以进行复杂布局
3.1.2 案例:九宫格的实现
现在我们实现携程的客户端首页实例,其web app地址是http://m.ctrip.com,下面我们实现酒店这一栏布局
实现:
var app = React.createClass
var styles=StyleSheet.create({})
'use strict';
var React = require('react-native');
var {
AppRegistry,
StyleSheet,
PixelRatio,
Text,
View
} = React;
var app = React.createClass({
render:function(){
return (
<View style={styles.flex}>
<View style={styles.container}>
<View style={[styles.item,styles.center]}>
<Text style={styles.font}>酒店</Text>
</View>
<View style={[styles.item,styles.lineLeftRight]}>
<View style={[styles.flex,styles.center,styles.lineCenter]}>
<Text style={styles.font}>海外酒店</Text>
</View>
<View style={[styles.flex,styles.center]}>
<Text style={styles.font}>特惠酒店</Text>
</View>
</View>
<View style={styles.item}>
<View style={[styles.flex,styles.center,styles.lineCenter]}>
<Text style={styles.font}>团购</Text>
</View>
<View style={[styles.flex,styles.center]}>
<Text style={styles.font}>客栈.公寓</Text>
</View>
</View>
</View>
</View>
);
}
});
var styles = StyleSheet.create({
container:{
// flex:1, // flex 代表权重,为1表示该元素就会把伸缩容器的剩余空间占满
borderWidth:1,
// borderColor:'red',
flexDirection:'row',// 默认是行排column(从上到下),现在设置为row(从左到右)
marginTop:25,
marginLeft:5,
marginRight:5,
padding:2,
borderRadius:5,
backgroundColor:'#FF0067',
},
item:{
flex:1,
height:80,
borderColor:'blue',
borderWidth:1
},
center:{
justifyContent:'center',// 垂直居中,实际上是按照flexDirection方向居中
alignItems:'center' // 水平居中
},
flex:{
flex:1
},
font:{
color:'#fff',
fontSize:16,
fontWeight:'bold'
},
lineLeftRight:{
borderLeftWidth:1/PixelRatio.get(),
borderRightWidth:1/PixelRatio.get(),
borderColor:'#fff'
},
lineCenter:{
borderBottomWidth:1/PixelRatio.get(),
borderColor:'#fff'
}
});
AppRegistry.registerComponent('Hello', () => app);
3.2 Text组件
Text组件主要用于显示文本,该特性表现为被触摸是否高亮,它同样支持多层嵌套,所以可以继承样式。
3.2.1 Text组件介绍
Text组件常用特性如下所示:
{"target":4,"layout":{"y":10,"width":300,"x":10,"height":117}}
,一般事件函数的形式是function(e){console.log(e.nativelEvent)},这样就可以打印事件的参数。 首先,我们来分析该页面的结构,这个页面的布局的比较简单,分为上、中、下三栏布局。
1、封装头部组件:封装成一个header.js文件
var Header = React.createClass({
render: function(){
return (
<View style={styles.flex}>
<Text style={styles.font}>
<Text style={styles.font_1}>網易</Text>
<Text style={styles.font_2}>新闻</Text>
<Text>有态度°</Text>
</Text>
</View>
);
}
});
var styles = StyleSheet.create({
flex:{
marginTop:25,
height:50,
borderBottomWidth:3/React.PixelRatio.get(),
borderBottomColor:'#EF2D36',
alignItems:'center' /* 使Text组件水平居中*/
},
font:{
fontSize:25,
fontWeight: 'bold',
textAlign:'center' /*使文字在Text组件中居中*/
},
font_1:{
color:'#CD1D1C'
},
font_2:{
color:'#FFF',
backgroundColor:'#CD1D1C',
}
});
module.exports = Header;
我们分析一下上面的代码,在代码最后我们将其export成独立的模块,在上面的代码中我们发现,Text组件嵌套之后就不会按照flexbox布局,这也符合我们的初粽,我们在最外层的Text组件定义了font样式,即规定了该Text组件内部的所有Text组件都是25pt,字体加粗并居中显示。同时为了对第一个和第二个Text组件做一些特别的处理,我们给它们加上了font_1和font_2样式,下面我们在index.ios.js中加载header.js文件中的Header组件
var Header = require('./header');
2、封装列表和今日要闻组件的代码:
var React = require('react-native');
var Header = require('./header');
var {
AppRegistry,
StyleSheet,
View,
Text
} = React;
var List = React.createClass({
render: function(){
return (
<View style={styles.list_item}>
<Text style={styles.list_item_font}>{this.props.title}</Text>
</View>
);
}
});
var ImportantNews = React.createClass({
show: function(title){
alert(title);
},
render: function(){
var news = [];
for(var i in this.props.news){
var text = (
<Text
onPress={this.show.bind(this, this.props.news[i])}
numberOfLines={2}
style={styles.news_item}>
{this.props.news[i]}
</Text>
);
news.push(text);
}
return (
<View style={styles.flex}>
<Text style={styles.news_title}>今日要闻</Text>
{news}
</View>
);
}
});
var app = React.createClass({
render: function(){
var news = [
'1、刘慈欣《三体》获“雨果奖”为中国作家首次',
'2、京津冀协同发展定位明确:北京无经济中心表述',
'3、好奇宝宝第一次淋雨,父亲用镜头记录了下来',
'4、京津冀协同发展定位明确::北京无经济中心表述+好奇宝宝第一次淋雨,父亲用镜头记录了下来'
];
return (
<View style={styles.flex}>
<Header></Header>
<List title='宇航员在太空宣布“三体”获奖'></List>
<List title='NASA发短片纪念火星征程50年'></List>
<List title='男生连续做一周苦瓜吃吐女友'></List>
<List title='女童遭鲨鱼袭击又下海救伙伴'></List>
<ImportantNews news={news}></ImportantNews>
</View>
);
}
});
var styles = StyleSheet.create({
flex:{
flex:1
},
list_item:{
height:40,
marginLeft:10,
marginRight:10,
borderBottomWidth:1,
borderBottomColor: '#ddd',
justifyContent: 'center'
},
list_item_font:{
fontSize:16
},
news_title:{
fontSize:20,
fontWeight:'bold',
color: '#CD1D1C',
marginLeft:10,
marginTop:15,
},
news_item:{
marginLeft:10,
marginRight:10,
fontSize:15,
lineHeight:20,
}
});
AppRegistry.registerComponent('APP', () => app);
在上面的代码中,我们给Text组件增加了onPress事件,这里,当新闻被按下的时候,会弹出新闻的标题,需要注意的是,这里面传参数时需要使用bind方法,该方法的第一个参数是上下文对象,第二个参数是传递参数;同时需要使用numberOfLines指定标题最多两行,此外,我们使用this.props获取传递的数据。
3.3 NavigatorIOS组件
是用来实现一个视图之间的切换和前进、后退。它就是NavigatorIOS组件,当然React Native也提供了一个兄弟组件,那就是Navigator
3.3.1 NavigatorIOS组件
该组件本质上是对UIKit navigation的包装,也就是说,使用NavigatorIOS进行路由切换、实质上是调用了UIKit的navigation。
路由是一个JavaScript对象,代表着一个页面或者说是视频组件,NavigatorIOS组件默认的路由提供了initialRoute属性,示例代码如下:
render:function(){ return( <NavigatorIOS initialRoute={{ component:MyView, title:'My View Title', passProps:{myProp:'foo'}, }} /> ); }
在上面的代码中,component表示该页面需要加载的组件视图,title表示需要在头部显示的标题,passProps用于页面间传递数据。
这里面简单介绍一下NavigatorIOS组件的属性,具体如下所示:
{
component:function,// 加载的视图组件
title:strng, // 当前视图的标题
passProps:object,// 传递的数据
backButtonIcon:Image.propTypes.source,后退按钮图标
backButtonTitle:string,// 后退按钮标题
leftButtonIcon:Image.propTypes.source,// 左边按钮图标
leftButtonTitle:string// 左边按钮标题
onLeftButtonPress:function,// 左边按钮点击事件
rightButtonIcon:Image.propTypes.source,// 右边按钮图标
rightButtonTitle:string,// 右边按钮标题
onRightButtonPress:function,// 右边按钮点击事件
wrapperStyle:[object object] // 包裹样式
}
3.2.2 案例:列表页跳转详情页
直接替换index.ios.js
var React = require('react-native');
var {
StyleSheet,
NavigatorIOS,
Text,
AppRegistry,
View,
ScrollView,
} = React;
var List = React.createClass({
render: function(){
return (
<ScrollView style={styles.flex}>
<Text style={styles.list_item} onPress={this.goTo}>☆ 豪华邮轮济州岛3日游</Text>
<Text style={styles.list_item} onPress={this.goTo}>☆ 豪华邮轮台湾3日游</Text>
<Text style={styles.list_item} onPress={this.goTo}>☆ 豪华邮轮地中海8日游</Text>
</ScrollView>
);
},
goTo: function(){
this.props.navigator.push({
component: Detail,
title: '邮轮详情',
rightButtonTitle: '购物车',
onRightButtonPress: function(){
alert('进入我的购物车');
}
});
}
});
var Detail = React.createClass({
render: function(){
return (
<ScrollView>
<Text>详情页</Text>
<Text>尽管信息很少,但这就是详情页</Text>
</ScrollView>
);
}
});
var NV = React.createClass({
render: function(){
return(
<NavigatorIOS
style={{flex:1}}
initialRoute={{
component: List,
title: '邮轮',
passProps: {},
}}
/>
);
}
});
var styles = StyleSheet.create({
flex:{
flex: 1,
},
list_item:{
lineHeight:25,
fontSize:16,
marginLeft:10,
marginRight:10
}
});
AppRegistry.registerComponent('APP', () => NV);
上面的代码分析,现在,我们清楚地知道NV组件调用List组件,List组件调用Detail组件,它们之间形成链式关系,所有的路由都被navigator.push到一个路由数组中,navigator对象对路由进行控制和跳转
3.4 TextInput组件
输入框必不可少,例如自动校验、占位符以及指定弹出不同的键盘类型等。
3.4.1TextInput组件介绍
主要属性和事件如下:
3.4.2 按钮:搜索自动提示:
待更新….