React Native 从零到一个小项目

前言

前阵子开始学习 React Native,一个人摸滚带爬的也算是能写个小项目了,在这里分享一下自己从零开始学习的过程,也推荐一些比较优秀的学习资源,让大家学习过程可以提高一些效率。

在路上

一、环境搭建和 IDE 选型

React Native 环境搭建可以看官网,也可以去看笔者的上篇文章,接下去是IDE 选型和配置的环节,有几种比较不错的 IDE:

  • Atom + Nuclide:Atom 本质上是一个文本编辑器,而不是一个 IDE,因此在用来开发 React Native 时需要配合 Nuclide 一起使用。
  • Sublime Text 3: 功能十分强大,主要在于它的插件机制。通过 Package Control 功能,可以安装各种需要的插件。
  • WebStorm:WebStorm 是著名的 JetBrains 公司开发的号称最智能的 Javascript 集成开发环境。
  • Visual Studio Code:Visual Studio Code 是微软推出的一个轻量级的开源 Web 集成开发环境。

笔者选择了 WebStorm ,只有一个原因,那就是它和 Andoid Studio 很像(笔者是 Andorid Developer)。

二、学习基础知识

因为没接触过 Web 前端这一块,所以第一天去学习了 JavaScript、html 和 css 一些基础的知识。记得那天疯狂的找学习的资料,刚开始在极客学院、慕课网这些学习网站上学习了一会,后面在知乎上还是 google 搜索到阮一峰大神的 es6 教程,非常不错。同时,也推荐 MDN,也是不错的学习 JavaScript 的地方。当时学习了一两天这些基础的知识,有了初步的了解。

三、了解 React Native

接下去就开始疯狂的搜索 React Native 的学习资料,因为完全不知道怎么去写 React Native,所以找到了一些免费的视频学习资源,如果你想要一些学习资源的话,可以去 React Native 学习指南看看,这边概括了很多优秀的学习资源,非常不错。说实话看视频效率实在有点低,你会发现视频只是在逐个讲解讲官网的组件和 Api ,所以笔者看了几天视频,对 React Native 有了初步了解后就没再接着看视频学习了。

四、学习优秀项目

当时笔者对 React Native 有了一点了解后,便去 GitHub 上寻找一些优秀的项目对其进行学习。这边给个网站,里面概括了一些优秀的项目。大家可以找一些 star 比较多的,然后更新时间比较近的项目进行学习,笔者是通过Gank.io项目进行学习。关于如何学习,给个建议就是 clone 到本地后,按照项目作者的时间线去学习。当然学习过程中会遇到一些你不明白的知识点,那正是你去巩固 JavaScript 或是 React 知识的时候,这样巩固学习比光看书学习效率高多了。

五、写一个项目

开始单独写一个项目练手,可以是一个真实项目,也可以是一个小项目用开放的 Api 去完成。笔者写的项目是通过豆瓣 Api 实现的,UI 界面大家可以自行充当设计师去设计,图标可以去 Iconfont 找。写完这个练手项目,你会更清楚如何去学习 React Native 。

项目介绍

首先看下效果图:

项目中运用了一些常用的第三方库,关于第三方库大家可以去 js.coach 查找。接下去对项目的界面和功能进行相应的介绍。

1.界面下方的主 tab

项目中有三个主 tab:首页、推荐和我的,通过 react-native-scrollable-tab-view 实现。使用示例如下:

render() {
    return (
        <TabNavigator tabBarStyle={{ height: 60, overflow: 'hidden' }}>
          <TabNavigator.Item
              selected={this.state.selectedTab === 'home'}
              title="首页"
              titleStyle={{color: 'rgb(169,183,183)', fontSize: 11}}
              selectedTitleStyle={{color: 'rgb(234,128,16)', fontSize: 11}}
              renderIcon={() => <Image source={require('./images/home_normal.png')}/>}
              renderSelectedIcon={() => <Image source={require('./images/home_selected.png')}/>}
              //badgeText ="1"
              onPress={() => this.setState({selectedTab: 'home'})}
          >
            < Home {...this.props}/>
          </TabNavigator.Item>

          <TabNavigator.Item
              selected={this.state.selectedTab === 'recommend'}
              title="推荐"
              titleStyle={{color: 'rgb(169,183,183)', fontSize: 11}}
              selectedTitleStyle={{color: 'rgb(234,128,16)', fontSize: 11}}
              renderIcon={() => <Image source={require('./images/recommend_normal.png')}/>}
              renderSelectedIcon={() => <Image source={require('./images/recomm_selected.png')}/>}
              onPress={() => this.setState({selectedTab: 'recommend'})}
          >
            < Recommend {...this.props} />
          </TabNavigator.Item>

          <TabNavigator.Item
              selected={this.state.selectedTab === 'mine'}
              title="我的"
              titleStyle={{color: 'rgb(169,183,183)', fontSize: 11}}
              selectedTitleStyle={{color: 'rgb(234,128,16)', fontSize: 11}}
              renderIcon={() => <Image source={require('./images/mine_normal.png')}/>}
              renderSelectedIcon={() => <Image source={require('./images/mine_selected.png')}/>}
              onPress={() => this.setState({selectedTab: 'mine'})}
          >
            < Mine { ...this.props }/>
          </TabNavigator.Item>

        </TabNavigator>

    );
  }

2.首页的图片轮播,使用了 react-native-viewpager 实现。使用示例如下:

定义数据源

this.state = {
      dataSource: new ViewPager.DataSource({
        pageHasChanged: (p1, p2) => p1 !== p2
      })
    };

 this.setState({
        dataSource: this.state.dataSource.cloneWithPages(contentData),
      });

应用 ViewPager 组件

<ViewPager
    dataSource={this.state.dataSource}
    renderPage={this.renderPage}
    isLoop={true}
    autoPlay={true}>
</ViewPager>

显示每个 Page 界面

_renderPage(data) {
    return (
        <Image style={ styles.pager } source={{uri: data.cover}}/>
    );
  }

3.推荐列表的呈现,ListView 的运用,使用示例如下:

设置数据源

this.state = {
      dataSource: new ListView.DataSource({
      rowHasChanged: (r1, r2) => r1 !== r2,
      }),
      data: null,
      loaded: false,
      isRefreshing: false,
      loadMore: false,
      start: 0,
      count: 20,
    };

应用 ListView 组件

<ListView
    dataSource = {this.state.dataSource}
    renderRow = {this._renderItem.bind(this)}
    onEndReached={this._loadMore.bind(this)}
    renderFooter={this._renderFooter.bind(this)}
    onEndReachedThreshold = {29}
    refreshControl={
        <RefreshControl
        refreshing={this.state.isRefreshing}
        onRefresh={this._refresh.bind(this)}
        tintColor='#aaaaaa'
        title='Loading...'
        progressBackgroundColor='#aaaaaa'/>
    }>
</ListView>

4.导航条的设置,使用 react-native-navbar 实现。使用示例如下:

<NavigationBar
    style = {{height:40}}
    title={{title: '首页'}}
/>

5.网络数据的获取,使用示例如下:

async fetchData() {
    let response = await fetch(API_TOP);
    let responseJson = await response.json();
    let responseData = responseJson.subjects;
    this.setState({
      data: responseData,
      dataSource: this.state.dataSource.cloneWithRows(responseData),
      loaded: true,
      isRefreshing: false,
    });
  }

总结

项目中还需要进行完善优化,后续会学习redux对架构进行修整,也会学习性能方面对项目进行修改,也会增添一些动画效果。希望能和大家一起学习,一起进步。

项目地址

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

推荐阅读更多精彩内容