[React-Native项目开发实践] 一、初步搭建并运行

该系列博文将从零开始建立一个React-Native项目。代码已经上传至:VanGank

  • 数据来源
    使用gank的api进行数据的获取,展示。

  • 使用XMLHttpRequestPromise
    XMLHttpRequest负责网络请求,Promise负责异步的封装。

基本框架搭建

1、参照移植Android原生进行了框架的搭建。

2、基本方法的书写

  • 监听返回键
// 构造
    constructor(props) {
        super(props);
        // 初始状态
        this.state = {};
        this.handleBack = this._handleBack.bind(this);
    }

    componentDidMount() {
        BackAndroid.addEventListener('hardwareBackPress', this.handleBack)
    }

    componentWillUnmount() {
        BackAndroid.removeEventListener('hardwareBackPress', this.handleBack)
    }

    _handleBack() {
        let navigator = this.navigator;
        if (navigator && navigator.getCurrentRoutes().length > 1) {
            navigator.pop();
            return true;
        }
        return false;
    }
  • Navigator 页面跳转

其实在react Native中实现跳转的方法很多:如之前的文章中提到:http://www.jianshu.com/p/9490713b3ef4

在看别人的react项目代码中看到别人的写法:

<Navigator
    ref={component=>this.navigator = component}
    initialRoute={{
        component:HomePage
    }}
    renderScene={(route, navigator) => { // 用来渲染navigator栈顶的route里的component页面
          // route={component: xxx, name: xxx, ...}, navigator.......route 用来在对应界面获取其他键值
          return <route.component navigator={navigator} {...route} {...route.passProps}/>
           // {...route.passProps}即就是把passProps里的键值对全部以给属性赋值的方式展开 如:test={10}
       }}
>

这样,在需要进行跳转的时候,只需要:

_homePageContext.props.navigator.push({
            component: WebViewPage,
            passProps: {
                androidHistoryItem
            }
        });

即可。

网络请求

使用Promise进行组织数据的异步请求,参照:Promise迷你书

1、第一个版本

    async getLatestDate(){
        let latestContent = new Promise((resolve, reject)=> {
            fetch(API_HISTORY)
                .then((response)=> {
                    return response.json();
                })
                .then((jsonResult)=> {
                    if (!jsonResult.error) {
                        resolve(jsonResult.results);
                    }
                })
        });
        return latestContent;
    },

这样,网络请求的结果(成功的结果和失败的error)封装到一个Promise对象中。然后,在请求数据处:

RequestUtils.getAndroidData(pageNo)
              .then((androidList)=> {
                  _homePageContext.setState({
                      loaded: true,
                      androidHistoryDataSource: this.state.androidHistoryDataSource.cloneWithRows(androidList)
                  });
              })

这样。如果首页只有一个接口需要请求,那么这样的封装是尚可的,但是,如果,在一个页面需要同时请求多个数据,则显得捉襟见肘。

2、改良版本

考虑到一个页面可能需要请求多个接口数据,可以使用Promiseall进行多个请求的封装。

单个URL的请求的封装

/**
* 访问Url
*
* @param url 访问的地址
* @param requestMethod 访问的方式
*/
requestUrl(url, requestMethod) {
   return new Promise((resolve, reject)=> {
       let req = new XMLHttpRequest();
       req.open(requestMethod, url, true);
       req.onload = ()=> {
           if (req.status === 200) {
               resolve(req.responseText);
           } else {
               reject(new Error(req.statusText));
           }
       };
       req.onerror = ()=> {
           reject(new Error(req.statusText));
       };
       req.send();
   })
}

然后,单个请求便可以如此:

requestAndroidData(pageNo) {
    return _context.requestUrl(ANDROID_HISTORY_URL + pageNo, 'GET').then(JSON.parse);
}

最后,当你请求多个数据之时,便可以如下做:

requestALL(pageNo, callBack) {
        Promise
            .all([_context.requestAndroidData(pageNo), _context.requestFULIData(pageNo)])
            .then((response)=> {
                callBack("OK", response);
            })
            .catch((error)=> {
                callBack("FAIL", error);
            })
    }

这里,将多个请求的结果封装到一个array中,并使用回调CallBack将成功和失败的信息回调到需要使用的地方。

于是乎,基本的界面搭建完毕。

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

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 170,544评论 25 707
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 11,595评论 4 59
  • 昨天我学习了当参数值Function_num=1或101时,SUBTOTAL函数的用法,那么后面还有10个参数选项...
    勇于有梦的春儿阅读 286评论 5 0
  • 不知道什么时候,有正儿八经的锻炼身体了。 下午,应同事的邀约去了健身房。 锻炼了身体,也参加了体型健康检测。 和同...
    叁客阅读 233评论 0 0
  • 说在前头,我选择的系统是Centos 6.8,以下操作及命令均以6.8版本为准,其他版本不保证。 今天我们配置ap...
    他夏了夏天我无眠阅读 317评论 0 1