React-Native項(xiàng)目技術(shù)分享(1)

網(wǎng)絡(luò)封裝

/**
 * 網(wǎng)絡(luò)請(qǐng)求工具類
 * Songlcy create
 * params:請(qǐng)求參數(shù)
 * successCallback:成功回調(diào)
 * failCallback:失敗回調(diào)
 */

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('***********************網(wǎng)絡(luò)請(qǐng)求報(bào)文******************************');
        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('服務(wù)器連接異常');
            }
        }).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();
        }

    }

}

環(huán)形提示

/**
 * 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
        }
    }
);

本地存儲(chǔ)

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

    /**
     * 保存數(shù)據(jù)到本地
     * key:數(shù)據(jù)存儲(chǔ)key
     * params:請(qǐng)求參數(shù)
     */

    saveDataToLocal: (key,params)=> {

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

    },

    /**
     * 從本地讀取數(shù)據(jù)
     * key:數(shù)據(jù)存儲(chǔ)key
     * successCallback:成功回調(diào)方法
     * failCallback:失敗回調(diào)方法
     */
    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;

調(diào)用網(wǎng)絡(luò)請(qǐng)求

/**
 * 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;

        //本地存儲(chǔ)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":"長(zhǎng)寧區(qū)&20101",
         "registerFlag":"1",
         "headImgBase64":null}
         */
    }

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

    render() {
        return (
            <TabNavigator >
                {this.creatTabItem('home', '優(yōu)保障',
                    require('../../image/icon/iconnavi1.png'),
                    require('../../image/icon/icon-navi-1-cur.png'),
                    styles.homeSelectStyle,
                    <HomeView navigator={this.props.navigator}/>
                )}
                {this.creatTabItem('enjoy', '享服務(wù)',
                    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'
    }
});
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,242評(píng)論 25 708
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,229評(píng)論 4 61
  • float和double主要為了科學(xué)計(jì)算和工程計(jì)算而設(shè)計(jì),執(zhí)行二進(jìn)制浮點(diǎn)運(yùn)算,這是為了在廣泛的數(shù)值范圍上提供較為...
    HHJG閱讀 480評(píng)論 0 1
  • 睡了整整一天,腦袋疼到要炸掉,傍晚的天空很美,趴在床上一直看著,想起卻起不來。 很多時(shí)候人們都愛活在自己的想象中,...
    up7閱讀 182評(píng)論 0 0