[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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

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

友情链接更多精彩内容