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閱讀 230,825評論 6 546
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,814評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,980評論 0 384
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 64,064評論 1 319
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,779評論 6 414
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,109評論 1 330
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,099評論 3 450
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,287評論 0 291
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,799評論 1 338
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,515評論 3 361
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,750評論 1 375
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,221評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,933評論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,327評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,667評論 1 296
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,492評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,703評論 2 380

推薦閱讀更多精彩內容