React native 項(xiàng)目入門(知乎日報(bào),豆瓣電影性锭,[one]一個)

更新:
目前增加了豆瓣電影和[one]一個功能模塊赠潦,具體可參考效果圖,其中[one]一個的api可參考One API分析草冈。
React Native 進(jìn)階請戳:React native 項(xiàng)目進(jìn)階(redux, redux saga, redux logger)
React Native 項(xiàng)目2(One 【一個】客戶端)

趁著中秋假期無事她奥,使用react native做了一個練手項(xiàng)目。首先看下效果圖:

Paste_Image.png

Paste_Image.png

Paste_Image.png

Paste_Image.png

Paste_Image.png

Paste_Image.png

Paste_Image.png

Paste_Image.png

Paste_Image.png

Paste_Image.png

Paste_Image.png

Paste_Image.png

這里重點(diǎn)說一下用到的api和一些第三方庫怎棱。這里貼一下代碼的地址react-native-simple-zhihu.

知乎日報(bào)api

已經(jīng)有大神對知乎日報(bào)的api進(jìn)行了分析哩俭,很詳細(xì)知乎日報(bào)api.
之前練習(xí)android項(xiàng)目的時候也用到了,表示非常感謝拳恋。

lib

這里主要使用了react-native-drawer凡资,react-native-router-flux

react-native-router-flux

react-native-router-flux是一個界面導(dǎo)航庫诅岩,目前已經(jīng)實(shí)現(xiàn)了redux讳苦,擴(kuò)展很方便,同時使用也非常簡單吩谦。
基本使用步驟:

  1. 注冊
    首先需要在App入口處對每個scene進(jìn)行注冊鸳谜,scene類似于android中的Activity。
<Router>
        <Scene key="root">
          <Scene key="pageOne" component={PageOne} title="PageOne" initial={true} />
          <Scene key="pageTwo" component={PageTwo} title="PageTwo" />
        </Scene>
      </Router>

其中key是required式廷,key是scene的唯一標(biāo)識咐扭,在進(jìn)行界面跳轉(zhuǎn)時使用Action.key即可完成跳轉(zhuǎn)。一般來說component也是必須設(shè)置的,是跳轉(zhuǎn)后的界面渲染蝗肪。
當(dāng)scene設(shè)置initial={true}時袜爪,為app的第一個界面

  1. 界面操作
  • 跳轉(zhuǎn)

Actions.Scene_Key(params)

在界面跳轉(zhuǎn)時,可以傳遞一些參數(shù)薛闪,類似于Android中的intent辛馆。

  • 退出

Actions.pop()

或者直接按返回鍵,這里返回鍵是被監(jiān)聽到的豁延。

  • 強(qiáng)制重現(xiàn)渲染

Action.refresh(params)

react-native-drawer

這是使用react實(shí)現(xiàn)的抽屜式菜單昙篙,與android中的抽屜式菜單很類似。

部分屬性說明
captureGestures true時可以截獲手勢操作
acceptDoubleTab true 雙擊打開或關(guān)閉drawer
acceptTab true 打擊打開或者關(guān)閉drawer诱咏,響應(yīng)區(qū)域受到panOpenMask, panCloseMask限制
negotiaPan true 只接受橫向手勢操作苔可,配合scrollview使用
panthreshold 打開drawer必須滑動的寬度比例
panOpenMask 打開drawer的可操作區(qū)域 從左向右計(jì)算比例
panCloseMask 關(guān)閉drawer的可操作區(qū)域,從右向左計(jì)算比例
initializationOpen 定義初始化時打開還是關(guān)閉
side drawer的位置:left or right

以下是文檔中的示例:

import Drawer from 'react-native-drawer'

class Application extends Component {
    closeControlPanel = () = >{
        this._drawer.close()
    };
    openControlPanel = () = >{
        this._drawer.open()
    };
    render() {
        return ( < Drawer ref = { (ref) = >this._drawer = ref
        }
        content = { < ControlPanel / >
        } > <MainView / ></Drawer>
    )
  }
})

項(xiàng)目實(shí)戰(zhàn)

  1. scene注冊
 render() {
        return (
            <Router>
                <Scene key="tabbar" component={Drawer}>
                    <Scene
                        key="main"
                        tabs
                        tabBarStyle={styles.tabBarStyle}
                        tabBarSelectedItemStyle={styles.tabBarSelectedItemStyle}>
                        <Scene key="ZhiHuPage" component={ZhiHuPage} title="知乎日報(bào)" initial icon={TabIcon}/>
                        <Scene key='StoryDetail' component={StoryDetailPage} hideNavBar={false}
                               navigationBarStyle={styles.playerTab}/>
                    </Scene>
                </Scene>
            </Router>

        )
    }
  1. 抽屜式菜單
return (
      <Drawer
        ref="navigation"
        type="displace"
        onOpen={() => Actions.refresh({ key: state.key, open: true })}
        onClose={() => Actions.refresh({ key: state.key, open: false })}
        content={<TabView />}
        tapToClose
        openDrawerOffset={0.2}
        panCloseMask={0.2}
        negotiatePan
        tweenHandler={(ratio) => ({
          main: { opacity: Math.max(0.54, 1 - ratio) },
        })}
      >
        <DefaultRenderer navigationState={children[0]} onNavigate={this.props.onNavigate} />
      </Drawer>
    );
  1. 數(shù)據(jù)列表頁
    數(shù)據(jù)列表頁使用ListView來展示日報(bào)的簡明數(shù)據(jù)
<View style={{flex: 1}}>
                <ListView
                    refreshControl={
                        <RefreshControl
                            refreshing={this.state.refreshing}
                            onRefresh={this.fetchDaily.bind(this)}
                        />
                    }
                    style={styles.listview}
                    dataSource={this.state.dataSource}
                    renderRow={(rowData, sectionID, rowID)=>
                        <StoryCell
                            story={rowData}
                        />
                    }
                />
            </View>

Storycell中定義每個cell的界面袋狞。

  • 數(shù)據(jù)請求
    使用fetch進(jìn)行數(shù)據(jù)請求
fetchDaily() {
        this.state.date = STORE.date;
        var url = "http://news.at.zhihu.com/api/4/news/before/" + STORE.date;
        fetch(url)
            .then((response)=>response.json())
            .then((jsonResponse) => {
                if (jsonResponse["stories"]) {
                    var stories = jsonResponse["stories"];
                    this.setState({
                        db: stories,
                        dataSource: this.state.dataSource.cloneWithRows(stories),
                        loaded: true,
                    })

                }
            }).catch((error) => {

            if (error instanceof SyntaxError) {
                this.setState({
                    db: [],
                    loaded: true,
                });
            }
        })
    }
  1. 詳情頁展示
    這里需要注意的是焚辅,日報(bào)api返回的是json數(shù)據(jù),給出了相應(yīng)的圖片地址苟鸯,html格式的data同蜻,share-url等數(shù)據(jù),我們這里直接使用Webview加載起share-url指向的地址倔毙。
  • 獲取json數(shù)據(jù)
fetchDaily() {
        var url = "http://news-at.zhihu.com/api/4/news/" + this.props.id;
        fetch(url)
            .then((response)=>response.json())
            .then((jsonResponse) => {
                if (jsonResponse["share_url"]) {
                    var shareUrl = jsonResponse["share_url"];
                    this.setState({
                        detailUrl: shareUrl
                    })
                }
            }).catch((error) => {

            if (error instanceof SyntaxError) {
                this.setState({});
            }
        })
    }
  • Webview渲染
render() {
      return (
          <View style={{flex: 1}}>
              <WebView style={styles.webview_style}
                       url={this.state.detailUrl}
                       startInLoadingState={true}
                       domStorageEnabled={true}
                       javaScriptEnabled={true}
              >
              </WebView>
          </View>
      )
  }

源碼地址

react-native-zhihu
https://github.com/wutongke/react-native-zhihu

推薦閱讀:

React-native項(xiàng)目入門與思考
React native 項(xiàng)目入門(知乎日報(bào)埃仪,豆瓣電影,[one]一個)
React native 項(xiàng)目進(jìn)階(redux, redux saga, redux logger)
React Native 項(xiàng)目2(One 【一個】客戶端)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末陕赃,一起剝皮案震驚了整個濱河市卵蛉,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌么库,老刑警劉巖傻丝,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異诉儒,居然都是意外死亡葡缰,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進(jìn)店門忱反,熙熙樓的掌柜王于貴愁眉苦臉地迎上來泛释,“玉大人,你說我怎么就攤上這事温算×#” “怎么了?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵注竿,是天一觀的道長茄茁。 經(jīng)常有香客問我魂贬,道長,這世上最難降的妖魔是什么裙顽? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任付燥,我火速辦了婚禮,結(jié)果婚禮上愈犹,老公的妹妹穿的比我還像新娘键科。我一直安慰自己,他們只是感情好漩怎,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布萝嘁。 她就那樣靜靜地躺著,像睡著了一般扬卷。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上酸钦,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天怪得,我揣著相機(jī)與錄音,去河邊找鬼卑硫。 笑死徒恋,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的欢伏。 我是一名探鬼主播入挣,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼硝拧!你這毒婦竟也來了径筏?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤障陶,失蹤者是張志新(化名)和其女友劉穎滋恬,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體抱究,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡恢氯,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了鼓寺。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片勋拟。...
    茶點(diǎn)故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖妈候,靈堂內(nèi)的尸體忽然破棺而出敢靡,到底是詐尸還是另有隱情,我是刑警寧澤州丹,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布醋安,位于F島的核電站杂彭,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏吓揪。R本人自食惡果不足惜亲怠,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望柠辞。 院中可真熱鬧团秽,春花似錦、人聲如沸叭首。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽焙格。三九已至图毕,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間眷唉,已是汗流浹背予颤。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留冬阳,地道東北人蛤虐。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像肝陪,于是被迫代替她去往敵國和親驳庭。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評論 2 355

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