在效果图中我们可以看出我的
这个功能界面中的cell
样式基本上是差不多,主要是在右侧
的功能上显示不一样的,所以我们把cell
简单的分析为左边显示iocn
和 title
的View
右边显示 >
和title
或者Image
的View
,所以我们将单个的cell
封装成一个组件,在相应的??橹械饔米榧纯?。
-
单个
cell
组件的功能封装:- 效果图:
- 示例代码:
import React, { Component } from 'react';
import {
AppRegistry,
StyleSheet,
Text,
View,
TouchableOpacity,
Image,
Platform,
AlertIOS,
} from 'react-native';
export default class MyCell extends Component {
static defaultProps = {
LeftTitle : '', // 左侧标题
LeftImage : '', // 左侧图片
RightTitle : '', // 右侧标题
RightImage : '', // 右侧图片
}
render() {
return (
<TouchableOpacity activeOpacity={0.5} onPress={()=>{alert('被点击了!')}}>
<View style={styles.cellStyles}>
{/*cell左侧内容*/}
<View style={styles.LeftViewStyle}>
<Image source={{uri:this.props.LeftImage}} style={styles.LeftImageStyle}/>
<Text style={styles.LeftTitleStyle}>{this.props.LeftTitle}</Text>
</View>
{/*cell右侧内容*/}
<View style={styles.RightViewStyle}>
{this.RightSubView()}
</View>
</View>
</TouchableOpacity>
);
}
// cell右侧子视图
RightSubView(){
return(
<View style={styles.RightViewStyle}>
{this.renderRightImageOrTitle()}
<Image source={{uri:'icon_cell_rightArrow'}} style={styles.RightArrowStyle}/>
</View>
)
}
// 右侧显示图片或者标题
renderRightImageOrTitle() {
if(this.props.RightImage.length == 0) { // 不显示图片
return(
<Text style={styles.RightTitleStyle}>{this.props.RightTitle}</Text>
)
} else {
return(
<Image source={{uri:this.props.RightImage}} style={styles.RightImageStyle}/>
)
}
}
}
const styles = StyleSheet.create({
cellStyles: {
height:Platform.OS == 'ios' ? 40 :30,
flexDirection:'row',
alignItems:'center',
justifyContent:'space-between',
backgroundColor:'white',
//下边框
borderBottomColor:'#E8E8E8',
borderBottomWidth:0.5,
},
LeftViewStyle: {
flexDirection:'row',
alignItems:'center',
},
RightViewStyle: {
flexDirection:'row',
alignItems:'center',
},
LeftTitleStyle: {
color:'gray',
marginLeft:6,
fontSize:16,
},
LeftImageStyle: {
width:24,
height:24,
marginLeft:6,
// 圆角
borderRadius:12
},
// 右侧箭头'>' 样式
RightArrowStyle: {
width:8,
height:16,
marginRight:8,
},
RightTitleStyle: {
color:'gray',
marginRight:8,
fontSize:16,
},
// 右侧图片样式
RightImageStyle: {
width:24,
height:13,
marginRight:6,
// 圆角
borderRadius:5,
},
});
module.exports = MyCell;
- 单个
cell
的组件封装完成,我们则需要在Me
功能??橹械饔米榧纯?。
/ 导入Mycell组件
var MyCell = require('./MyCell');
export default class HJMe extends Component {
render() {
return (
<ScrollView style={{backgroundColor:'#e8e8e8'}}>
<View style={{marginTop:10}}>
<MyCell
LeftImage="collect"
LeftTitle="我的订单"
RightTitle="查看全部订单"
/>
</View>
<View style={{marginTop:10}}>
<MyCell
LeftImage="draft"
LeftTitle="钱包"
RightTitle="账户余额:¥100.88"
/>
<MyCell
LeftImage="like"
LeftTitle="抵用券"
RightTitle="10张"
/>
</View>
<View style={{marginTop:10}}>
<MyCell
LeftImage="card"
LeftTitle="积分商城"
/>
</View>
<View style={{marginTop:10}}>
<MyCell
LeftImage="new_friend"
LeftTitle="今日推荐"
RightImage="me_new"
/>
</View>
<View style={{marginTop:10}}>
<MyCell
LeftImage="pay"
LeftTitle="我要合作"
RightTitle="轻松开店,招财进宝"
/>
</View>
</ScrollView>
);
}
}
const styles = StyleSheet.create({
});
module.exports = HJMe;
-
中间
代付款
四个按钮的功能实现:-
代付款
待使用
待评价
退款/售后
四个按钮布局功能都非常相似,所以我们可以将其封装成一个类
为我们使用。 - 效果图:
-
- 第一步:创建一个单独的
InnerView
类class InnerView extends React.Component
// 创建里面组件的类
class InnerView extends React.Component {
static defaultProps = {
iconName:'',
title:'',
}
render() {
return(
<TouchableOpacity activeOpacity={0.5} onPress={()=>{alert(this.props.title)}}>
<View style={styles.innerViewStyle}>
<Image source={{uri:this.props.iconName}} style={styles.ImageStyles}/>
<Text style={{color:'gray'}}>{this.props.title}</Text>
</View>
</TouchableOpacity>
)
}
}
- 第二步:设置
MiddleData.json
文件数据
[
{"iconName":"order1","title":"待付款"},
{"iconName":"order2","title":"待使用"},
{"iconName":"order3","title":"待评价"},
{"iconName":"order4","title":"退款/售后"}
]
- 第三步: 从
MiddleData.json
获取出单个InnerView
数据
export default class MiddleView extends Component {
render() {
return (
<View style={styles.container}>
{this.allItems()}
</View>
);
}
// 所有的items
allItems() {
var ItemArr = [];
//遍历
for(var i = 0; i < MiddleData.length; i++) {
// 取出单个对象
var Itemdata = MiddleData[i];
ItemArr.push(
<InnerView key={i} iconName={Itemdata.iconName} title={Itemdata.title} />
)
}
// 返回数组
return ItemArr;
}
}
- 示例代码:
import React, { Component } from 'react';
import {
AppRegistry,
StyleSheet,
Text,
View,
Image,
TouchableOpacity,
AlertIOS,
} from 'react-native';
// 导入数据
var MiddleData = require('./MiddleData.json');
var Dimensions = require('Dimensions');
var {width, height} = Dimensions.get('window');
export default class MiddleView extends Component {
render() {
return (
<View style={styles.container}>
{this.allItems()}
</View>
);
}
// 所有的items
allItems() {
var ItemArr = [];
//遍历
for(var i = 0; i < MiddleData.length; i++) {
// 取出单个对象
var Itemdata = MiddleData[i];
ItemArr.push(
<InnerView key={i} iconName={Itemdata.iconName} title={Itemdata.title} />
)
}
// 返回数组
return ItemArr;
}
}
// 创建里面组件的类
class InnerView extends React.Component {
static defaultProps = {
iconName:'',
title:'',
}
render() {
return(
<TouchableOpacity activeOpacity={0.5} onPress={()=>{alert(this.props.title)}}>
<View style={styles.innerViewStyle}>
<Image source={{uri:this.props.iconName}} style={styles.ImageStyles}/>
<Text style={{color:'gray'}}>{this.props.title}</Text>
</View>
</TouchableOpacity>
)
}
}
const styles = StyleSheet.create({
container: {
flexDirection:'row',
backgroundColor:'white',
alignItems:'center',
justifyContent:'space-around',
},
innerViewStyle: {
width:width/4,
height:70,
marginBottom:3,
alignItems:'center',
justifyContent:'center',
},
ImageStyles: {
width:40,
height:30,
marginBottom:3,
},
});
module.exports = MiddleView;
-
顶部视图的完善
- 效果图
- 创建
MeHeaderView
文件,并且将MeHeaderView
视图分为头像
昵称
的视图为TopView
,将优惠券
评价
收藏
的视图为BottomView
-
TopView
的功能完善:
-
import React, { Component } from 'react';
import {
AppRegistry,
StyleSheet,
Text,
View,
Image,
TouchableOpacity,
} from 'react-native';
var Dimensions = require('Dimensions');
var {Screenwidth} = Dimensions.get('window');
export default class MeHeaderView extends Component {
render() {
return (
<View style={styles.container}>
{this.renderTopView()}
</View>
);
}
// 头像 昵称 界面
renderTopView(){
return(
<View style={styles.topViewStyle}>
<TouchableOpacity activeOpacity={1.0} onPress={()=>{alert('跳转到修改个人资料!')}}>
<View style={styles.RightViewStyle}>
<Image source={{uri:'new_friend'}} style={styles.leftIconStyle} />
<Text style={{fontSize:18,color:'white',fontWeight:'bold'}}>XX电商</Text>
<Image source={{uri:'avatar_vip'}} style={{width:17,height:17}} />
</View>
</TouchableOpacity>
<View>
<Image source={{uri:'icon_cell_rightArrow'}} style={{width:8,height:13,marginRight:8}} />
</View>
</View>
)
}
renderBottomView(){
}
}
const styles = StyleSheet.create({
container: {
height:120,
backgroundColor:'rgb(255,96,0)'
},
topViewStyle:{
flexDirection:'row',
marginTop:40,
alignItems:'center',
justifyContent:'space-between'
},
leftIconStyle:{
width:70,
height:70,
borderRadius:35,
borderWidth:3,
borderColor:'rgba(0,0,0,0.2)',
marginLeft:20,
marginRight:20,
},
RightViewStyle: {
flexDirection:'row',
alignItems:'center',
},
conterViewStyle:{
flexDirection:'row',
width:Screenwidth*0.6,
},
});
module.exports = MeHeaderView;
-
BottomView
的功能完善:
-效果图:
- 示例代码:
import React, { Component } from 'react';
import {
AppRegistry,
StyleSheet,
Text,
View,
Image,
TouchableOpacity,
} from 'react-native';
var Dimensions = require('Dimensions');
var screenW = Dimensions.get('window').width;
export default class MeHeaderView extends Component {
render() {
return (
<View style={styles.container}>
{this.renderTopView()}
{this.renderBottomView()}
</View>
);
}
// 头像 昵称 界面
renderTopView(){
return(
<View style={styles.topViewStyle}>
<TouchableOpacity activeOpacity={1.0} onPress={()=>{alert('跳转到修改个人资料!')}}>
<View style={styles.RightViewStyle}>
<Image source={{uri:'new_friend'}} style={styles.leftIconStyle} />
<Text style={{fontSize:18,color:'white',fontWeight:'bold'}}>XX电商</Text>
<Image source={{uri:'avatar_vip'}} style={{width:17,height:17}} />
</View>
</TouchableOpacity>
<View>
<Image source={{uri:'icon_cell_rightArrow'}} style={{width:8,height:13,marginRight:8}} />
</View>
</View>
)
}
renderBottomView(){
return(
<View style={styles.BottomViewStyle}>
{this.BottomItems()}
</View>
)
}
BottomItems() {
var ItemArr = [];
// 数据
var ItemData = [{'number':'50',
'title' :'购物券'
},
{'number':'100',
'title' :'评价'
},
{'number':'28',
'title' :'收藏'
}];
// 遍历
for(var i = 0;i < ItemData.length;i++){
// 取出每一条数组
var OneItemData = ItemData[i];
ItemArr.push(
<TouchableOpacity key = {i} activeOpacity={0.5} onPress={()=>{alert('跳到'+OneItemData.title+'界面')}}>
<View style={styles.BottomInnerViewStyle}>
<Text style={{color:'white'}}>{OneItemData.title}</Text>
<Text style={{color:'white'}}>{OneItemData.number}</Text>
</View>
</TouchableOpacity>
)
}
return ItemArr;
}
}
const styles = StyleSheet.create({
container: {
height:160,
backgroundColor:'rgb(255,96,0)'
},
topViewStyle:{
flexDirection:'row',
marginTop:40,
alignItems:'center',
justifyContent:'space-between'
},
leftIconStyle:{
width:70,
height:70,
borderRadius:35,
borderWidth:3,
borderColor:'rgba(0,0,0,0.2)',
marginLeft:20,
marginRight:20,
},
RightViewStyle: {
flexDirection:'row',
alignItems:'center',
},
BottomViewStyle: {
flexDirection:'row',
// 绝对定位
position:'absolute',
bottom:0,
},
BottomInnerViewStyle: {
width:(screenW/3)+1,
height:40,
backgroundColor:'rgba(255,255,255,0.4)',
justifyContent:'center',
alignItems:'center',
borderRightWidth:1,
borderRightColor:'white'
},
});
module.exports = MeHeaderView;
-
Demo下载
-
运行项目
- a)打开终端,输入:cd 项目根目录 进到项目目录
- b)输入:npm install,下载node_modules
- c)运行在iOS设备:react-native run-ios
- d)运行在Android设备:react-native run-android
-