React Native项目 - ·我的·界面

在效果图中我们可以看出我的这个功能界面中的cell样式基本上是差不多,主要是在右侧的功能上显示不一样的,所以我们把cell简单的分析为左边显示iocntitleView 右边显示 >title或者ImageView,所以我们将单个的cell封装成一个组件,在相应的模块中调用组件即可。

  • 单个cell组件的功能封装:

    • 效果图:
MeCells.gif
  • 示例代码:
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;

  • 中间代付款四个按钮的功能实现:

    • 代付款 待使用 待评价 退款/售后四个按钮布局功能都非常相似,所以我们可以将其封装成一个为我们使用。
    • 效果图:
MeMiddleView.gif
  • 第一步:创建一个单独的InnerViewclass 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;

  • 顶部视图的完善

    • 效果图
HeaderView.gif
  • 创建 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的功能完善:
    -效果图:
BottomView.gif
  • 示例代码:
 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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,088评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,715评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,361评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,099评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,987评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,063评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,486评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,175评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,440评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,518评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,305评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,190评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,550评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,152评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,451评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,637评论 2 335

推荐阅读更多精彩内容