React-Native项目技术分享(1)

网络封装

/**
 * 网络请求工具类
 * Songlcy create
 * params:请求参数
 * successCallback:成功回调
 * failCallback:失败回调
 */

import RootToast from '../pages/RootToast/RootToast'

var host = 'https://.do';
import ShowProgress from '../pages/ProgressHUD/ShowProgress';
let showProgress = new ShowProgress;

let Network = {

    postNetwork: (params,successCallBack, failCallBack)=> {

        if(params.isProgress === '1' ){
            showProgress.show();
        }

        console.log('***********************网络请求报文******************************');
        console.log( JSON.stringify(params));
        console.log('================================================================');

        paramStr = 'transCode=' + params.transCode + '&requestBodyJson=' + JSON.stringify(params.request);

        fetch(host,
            {
                method: 'POST',
                headers: {
                    'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
                    "Cookie":JSON.stringify({})
                },
                body: paramStr
            }
        ).then((response) => {
            showProgress.hidden();
            if (response.ok) {
                return response.json();
            } else {
                RootToast.show('服务器连接异常');
            }
        }).then((response) => {
            console.log('***********************成功返回****************************');
            console.log( JSON.stringify(response));
            console.log('================================================================');
            if (response.responseBody == null) {
                RootToast.show(response.errorMsg);
                if (failCallBack && typeof(failCallBack) == 'function'){
                    failCallBack(response);
                }
            } else {
                successCallBack(response);
            }
        }).catch((error) => {
            showProgress.hidden();
            console.log(error.message);
            if (failCallBack && typeof(failCallBack) == 'function') {
                failCallBack(error);
            }
        })
    }
}
export default Network;

提示

/**
 * RootToast.js
 */

import Toast from 'react-native-root-toast';
let RootToast = {
    toast:null,
    show:(msg)=>{
      this.toast = Toast.show(msg,{
            position:0,
            duration:1500
        })
    }
}
export default RootToast;
/**
 * ShowProgress.js
 */


import React,{Component} from 'react'

import RootSiblings from 'react-native-root-siblings';

import ProgressHUD from './ProgressHUD';

let sibling = null;

export default class ShowProgress{

    show(){

        sibling  = new RootSiblings(<ProgressHUD />);

    }

    hidden(){

        if(sibling instanceof RootSiblings){
            sibling.destroy();
        }

    }

}

环形提示

/**
 * ProgressHUD.js
 */
import React, {Component} from 'react';

import {

    View,
    Dimensions,
    StyleSheet,
    Platform
}from 'react-native';

import  * as Progress from 'react-native-progress'
const {width, height} = Dimensions.get('window')
export default class ProgressHUD extends Component {
    render(){
        return(
            <View style={styles.baseViewStyle}>
                <View style={styles.backViewStyle}>
                    <Progress.Circle size={width/8} indeterminate={true} />
                </View>
            </View>
        );
    }
}

const styles = StyleSheet.create(
    {
        baseViewStyle:{
            position:'absolute',
            top:(Platform.OS=='ios')?64:44,
            height:(Platform.OS=='ios')?height-64:height-44,
            width:width,
            alignItems:'center',
            backgroundColor:'rgba(0,0,0,0.2)'
        },
        backViewStyle:{
            backgroundColor:'white',
            width:width/4,
            height:width/4,
            borderRadius:10,
            justifyContent:'center',
            alignItems:'center',
            marginTop:height/4
        }
    }
);

本地存储

/**
 * LocalStorage.js
 */
let LocalStorage = {

    /**
     * 保存数据到本地
     * key:数据存储key
     * params:请求参数
     */

    saveDataToLocal: (key,params)=> {

        global.localStorage.save({
            key: key,
            rawData: params,
            expires: null
        });

    },

    /**
     * 从本地读取数据
     * key:数据存储key
     * successCallback:成功回调方法
     * failCallback:失败回调方法
     */
    loadDataFromLocal:(key,successCallback,failCallback)=>{

        global.localStorage.load({
            key: key,

        }).then(ret => {

            successCallback(ret);

        }).catch(err => {

            switch (err.name) {
                case 'NotFoundError':
                    // TODO;
                    successCallback("");
                    break;
                case 'ExpiredError':
                    // TODO
                    break;
            }
        })
    }
}

export default LocalStorage;

调用网络请求

/**
 * Main.js
 */

import React, {Component} from 'react';
import {
    StyleSheet,
    Text,
    View,
    Image,
    Navigator,
    AsyncStorage
} from 'react-native';

import TabNavigator from 'react-native-tab-navigator';
import HomeView from './Home.js';
import EnjoyView from './Enjoy.js';
import LifeView from './Life.js';
import Storage from 'react-native-storage';

import LocalStorage from '../../LocalStorage/LocalStorage';
import Network from '../../Network/Network'

export default class Main extends Component {
    constructor(props) {
        super(props);
        this.state = {selectedTab: 'home'};
    }

    componentDidMount() {
        var storage = new Storage({
            size: 1000,
            storageBackend: AsyncStorage,
            defaultExpires:null,
            enableCache:true,
            sync : {
                // we'll talk about the details later.
            }
        });

        global.localStorage = storage;

        //本地存储accessToken
        var accessToken = '0af25eb6666aebf2a3f561b7a174311453204fb9c789a64b3934975cb6b5d13b9166f614785a0b41';
        LocalStorage.saveDataToLocal('accessToken', accessToken);

        //查询用户信息
        let params = {
            transCode: 'T1004',
            request: {
                loginName: '13020130525',
                accessToken: accessToken
            }
        };
        Network.postNetwork(params, this.successCallBack, this.failCallBack);
    }

    successCallBack(data) {

        LocalStorage.saveDataToLocal('userInfo', data.responseBody.user);

        LocalStorage.saveDataToLocal('myCarList', ['footer']);

        /*
        userInfo的格式
        {"loginName":"13020130525",
         "userName":"周舫旭",
         "idType":"1",
         "idNumber":"410381199004214033",
         "telphone":"13020130525",
         "email":"2222@163.com",
         "recommendMobile":null,
         "recommendTimes":0,
         "certFlag":"1",
         "headPicPath":null,
         "nickName":null,
         "gender":"0",
         "userId":27377,
         "address":"2222222",
         "branchCompany":"3010100",
         "postcode":"123545",
         "province":"上海&2",
         "city":"上海&201",
         "area":"长宁区&20101",
         "registerFlag":"1",
         "headImgBase64":null}
         */
    }

    failCallBack(data) {
        //console.log(data);
    }

    render() {
        return (
            <TabNavigator >
                {this.creatTabItem('home', '优保障',
                    require('../../image/icon/iconnavi1.png'),
                    require('../../image/icon/icon-navi-1-cur.png'),
                    styles.homeSelectStyle,
                    <HomeView navigator={this.props.navigator}/>
                )}
                {this.creatTabItem('enjoy', '享服务',
                    require('../../image/icon/icon-navi-2.png'),
                    require('../../image/icon/icon-navi-2-cur.png'),
                    styles.enjoySelectedStyle,
                    <EnjoyView navigator={this.props.navigator}/>
                )}
                {this.creatTabItem('life', '汇生活',
                    require('../../image/icon/icon-navi-3.png'),
                    require('../../image/icon/icon-navi-3-cur.png'),
                    styles.lifeSelectStyle,
                    <LifeView navigator={this.props.navigator}/>
                )}
            </TabNavigator>
        );
    }

    creatTabItem(selected, title, renderIcon, selectedIcon, selectedTitleStyle, childView) {

        return (
            <TabNavigator.Item selected={this.state.selectedTab === selected}
                               title={title}
                               renderIcon={() => <Image source={renderIcon} style={styles.iconStyle}/>}
                               renderSelectedIcon={() => <Image source={selectedIcon} style={styles.iconStyle}/>}
                               selectedTitleStyle={selectedTitleStyle}
                               onPress={() => this.setState({selectedTab: selected})}>
                {childView}
            </TabNavigator.Item>
        );
    }
}

const styles = StyleSheet.create({
    homeSelectStyle: {
        color: '#005bac'
    },
    enjoySelectedStyle: {
        color: '#009ddc'
    },
    lifeSelectStyle: {
        color: 'orange'
    },
    iconStyle: {
        width: 25,
        height: 30,
        resizeMode: 'contain'
    }
});
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,802评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,109评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,683评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,458评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,452评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,505评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,901评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,550评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,763评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,556评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,629评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,330评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,898评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,897评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,140评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,807评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,339评论 2 342

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,373评论 25 707
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,016评论 4 62
  • float和double主要为了科学计算和工程计算而设计,执行二进制浮点运算,这是为了在广泛的数值范围上提供较为...
    HHJG阅读 450评论 0 1
  • 睡了整整一天,脑袋疼到要炸掉,傍晚的天空很美,趴在床上一直看着,想起却起不来。 很多时候人们都爱活在自己的想象中,...
    up7阅读 164评论 0 0