React Native 從零到一個(gè)小項(xiàng)目

前言

前陣子開(kāi)始學(xué)習(xí) React Native,一個(gè)人摸滾帶爬的也算是能寫(xiě)個(gè)小項(xiàng)目了带欢,在這里分享一下自己從零開(kāi)始學(xué)習(xí)的過(guò)程,也推薦一些比較優(yōu)秀的學(xué)習(xí)資源,讓大家學(xué)習(xí)過(guò)程可以提高一些效率俺猿。

在路上

一、環(huán)境搭建和 IDE 選型

React Native 環(huán)境搭建可以看官網(wǎng),也可以去看筆者的上篇文章蜈敢,接下去是IDE 選型和配置的環(huán)節(jié)辜荠,有幾種比較不錯(cuò)的 IDE:

  • Atom + Nuclide:Atom 本質(zhì)上是一個(gè)文本編輯器,而不是一個(gè) IDE抓狭,因此在用來(lái)開(kāi)發(fā) React Native 時(shí)需要配合 Nuclide 一起使用伯病。
  • Sublime Text 3: 功能十分強(qiáng)大,主要在于它的插件機(jī)制。通過(guò) Package Control 功能午笛,可以安裝各種需要的插件惭蟋。
  • WebStorm:WebStorm 是著名的 JetBrains 公司開(kāi)發(fā)的號(hào)稱最智能的 Javascript 集成開(kāi)發(fā)環(huán)境。
  • Visual Studio Code:Visual Studio Code 是微軟推出的一個(gè)輕量級(jí)的開(kāi)源 Web 集成開(kāi)發(fā)環(huán)境药磺。

筆者選擇了 WebStorm 告组,只有一個(gè)原因,那就是它和 Andoid Studio 很像(筆者是 Andorid Developer)癌佩。

二木缝、學(xué)習(xí)基礎(chǔ)知識(shí)

因?yàn)闆](méi)接觸過(guò) Web 前端這一塊,所以第一天去學(xué)習(xí)了 JavaScript围辙、html 和 css 一些基礎(chǔ)的知識(shí)我碟。記得那天瘋狂的找學(xué)習(xí)的資料,剛開(kāi)始在極客學(xué)院姚建、慕課網(wǎng)這些學(xué)習(xí)網(wǎng)站上學(xué)習(xí)了一會(huì)矫俺,后面在知乎上還是 google 搜索到阮一峰大神的 es6 教程,非常不錯(cuò)掸冤。同時(shí)厘托,也推薦 MDN,也是不錯(cuò)的學(xué)習(xí) JavaScript 的地方稿湿。當(dāng)時(shí)學(xué)習(xí)了一兩天這些基礎(chǔ)的知識(shí)铅匹,有了初步的了解。

三缎罢、了解 React Native

接下去就開(kāi)始瘋狂的搜索 React Native 的學(xué)習(xí)資料伊群,因?yàn)橥耆恢涝趺慈?xiě) React Native,所以找到了一些免費(fèi)的視頻學(xué)習(xí)資源策精,如果你想要一些學(xué)習(xí)資源的話舰始,可以去 React Native 學(xué)習(xí)指南看看,這邊概括了很多優(yōu)秀的學(xué)習(xí)資源咽袜,非常不錯(cuò)丸卷。說(shuō)實(shí)話看視頻效率實(shí)在有點(diǎn)低,你會(huì)發(fā)現(xiàn)視頻只是在逐個(gè)講解講官網(wǎng)的組件和 Api 询刹,所以筆者看了幾天視頻谜嫉,對(duì) React Native 有了初步了解后就沒(méi)再接著看視頻學(xué)習(xí)了。

四凹联、學(xué)習(xí)優(yōu)秀項(xiàng)目

當(dāng)時(shí)筆者對(duì) React Native 有了一點(diǎn)了解后沐兰,便去 GitHub 上尋找一些優(yōu)秀的項(xiàng)目對(duì)其進(jìn)行學(xué)習(xí)。這邊給個(gè)網(wǎng)站蔽挠,里面概括了一些優(yōu)秀的項(xiàng)目住闯。大家可以找一些 star 比較多的,然后更新時(shí)間比較近的項(xiàng)目進(jìn)行學(xué)習(xí),筆者是通過(guò)Gank.io項(xiàng)目進(jìn)行學(xué)習(xí)比原。關(guān)于如何學(xué)習(xí)插佛,給個(gè)建議就是 clone 到本地后,按照項(xiàng)目作者的時(shí)間線去學(xué)習(xí)量窘。當(dāng)然學(xué)習(xí)過(guò)程中會(huì)遇到一些你不明白的知識(shí)點(diǎn)雇寇,那正是你去鞏固 JavaScript 或是 React 知識(shí)的時(shí)候,這樣鞏固學(xué)習(xí)比光看書(shū)學(xué)習(xí)效率高多了蚌铜。

五锨侯、寫(xiě)一個(gè)項(xiàng)目

開(kāi)始單獨(dú)寫(xiě)一個(gè)項(xiàng)目練手,可以是一個(gè)真實(shí)項(xiàng)目厘线,也可以是一個(gè)小項(xiàng)目用開(kāi)放的 Api 去完成识腿。筆者寫(xiě)的項(xiàng)目是通過(guò)豆瓣 Api 實(shí)現(xiàn)的,UI 界面大家可以自行充當(dāng)設(shè)計(jì)師去設(shè)計(jì)造壮,圖標(biāo)可以去 Iconfont 找。寫(xiě)完這個(gè)練手項(xiàng)目骂束,你會(huì)更清楚如何去學(xué)習(xí) React Native 耳璧。

項(xiàng)目介紹

首先看下效果圖:

項(xiàng)目中運(yùn)用了一些常用的第三方庫(kù),關(guān)于第三方庫(kù)大家可以去 js.coach 查找展箱。接下去對(duì)項(xiàng)目的界面和功能進(jìn)行相應(yīng)的介紹旨枯。

1.界面下方的主 tab

項(xiàng)目中有三個(gè)主 tab:首頁(yè)、推薦和我的混驰,通過(guò) react-native-scrollable-tab-view 實(shí)現(xiàn)攀隔。使用示例如下:

render() {
    return (
        <TabNavigator tabBarStyle={{ height: 60, overflow: 'hidden' }}>
          <TabNavigator.Item
              selected={this.state.selectedTab === 'home'}
              title="首頁(yè)"
              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.首頁(yè)的圖片輪播,使用了 react-native-viewpager 實(shí)現(xiàn)栖榨。使用示例如下:

定義數(shù)據(jù)源

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

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

應(yīng)用 ViewPager 組件

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

顯示每個(gè) Page 界面

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

3.推薦列表的呈現(xiàn)昆汹,ListView 的運(yùn)用,使用示例如下:

設(shè)置數(shù)據(jù)源

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

應(yīng)用 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.導(dǎo)航條的設(shè)置婴栽,使用 react-native-navbar 實(shí)現(xiàn)满粗。使用示例如下:

<NavigationBar
    style = {{height:40}}
    title={{title: '首頁(yè)'}}
/>

5.網(wǎng)絡(luò)數(shù)據(jù)的獲取,使用示例如下:

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,
    });
  }

總結(jié)

項(xiàng)目中還需要進(jìn)行完善優(yōu)化愚争,后續(xù)會(huì)學(xué)習(xí)redux對(duì)架構(gòu)進(jìn)行修整映皆,也會(huì)學(xué)習(xí)性能方面對(duì)項(xiàng)目進(jìn)行修改,也會(huì)增添一些動(dòng)畫(huà)效果轰枝。希望能和大家一起學(xué)習(xí)捅彻,一起進(jìn)步。

項(xiàng)目地址

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末鞍陨,一起剝皮案震驚了整個(gè)濱河市步淹,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖贤旷,帶你破解...
    沈念sama閱讀 211,817評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件广料,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡幼驶,警方通過(guò)查閱死者的電腦和手機(jī)艾杏,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)盅藻,“玉大人购桑,你說(shuō)我怎么就攤上這事∈鲜纾” “怎么了勃蜘?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,354評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)假残。 經(jīng)常有香客問(wèn)我缭贡,道長(zhǎng),這世上最難降的妖魔是什么辉懒? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,498評(píng)論 1 284
  • 正文 為了忘掉前任阳惹,我火速辦了婚禮,結(jié)果婚禮上眶俩,老公的妹妹穿的比我還像新娘莹汤。我一直安慰自己,他們只是感情好颠印,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,600評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布纲岭。 她就那樣靜靜地躺著,像睡著了一般线罕。 火紅的嫁衣襯著肌膚如雪止潮。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,829評(píng)論 1 290
  • 那天闻坚,我揣著相機(jī)與錄音沽翔,去河邊找鬼。 笑死窿凤,一個(gè)胖子當(dāng)著我的面吹牛仅偎,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播雳殊,決...
    沈念sama閱讀 38,979評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼橘沥,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了夯秃?” 一聲冷哼從身側(cè)響起座咆,我...
    開(kāi)封第一講書(shū)人閱讀 37,722評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤痢艺,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后介陶,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體堤舒,經(jīng)...
    沈念sama閱讀 44,189評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,519評(píng)論 2 327
  • 正文 我和宋清朗相戀三年哺呜,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了舌缤。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,654評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡某残,死狀恐怖国撵,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情玻墅,我是刑警寧澤介牙,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布,位于F島的核電站澳厢,受9級(jí)特大地震影響环础,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜剩拢,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,940評(píng)論 3 313
  • 文/蒙蒙 一喳整、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧裸扶,春花似錦、人聲如沸搬素。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,762評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)熬尺。三九已至摸屠,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間粱哼,已是汗流浹背季二。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,993評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留揭措,地道東北人胯舷。 一個(gè)月前我還...
    沈念sama閱讀 46,382評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像绊含,于是被迫代替她去往敵國(guó)和親桑嘶。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,543評(píng)論 2 349

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