前段時間開始學習React Native,而後試着開始作一個小項目,在練手的同時,分享出來但願和各位同窗互相學習react-native項目。以前寫過項目相關的文章,沒看過的同窗能夠參考一下:javascript
目前項目完成了(One 【一個】)主體界面功能,固然功能和原App還有較大的差距,以前主要對ios進行了適配,這兩天對Android也進行了一些調整。有什麼bug你們能夠評論或者在github上提issue。先看一下效果圖:html
React Native 從第一次提交到如今已經有20個月的時間,目前github上有近4萬star,不少大牛貢獻了各類第三方庫,目前開始學習React Native對於新人初學者來講文檔和社區很是友好。這裏羅列下用到的第三方庫:java
"react-native-button": "github:ide/react-native-button",
"react-native-datepicker": "^1.3.2",
"react-native-drawer": "^2.2.2",
"react-native-fs": "^2.0.1-rc.2",
"react-native-root-toast": "^1.0.3",
"react-native-router-flux": "[3.30.1]",
"react-native-scrollable-tab-view": "0.6.0",
"react-native-sound": "^0.8.3",
"react-native-viewpager": "^0.2.1",
"react-redux": "^4.4.5",
"redux": "^3.6.0",
"redux-logger": "^2.6.1",
"redux-saga": "^0.11.1"複製代碼
其中部分比較簡單,有些在以前的文章中進行了介紹,下面主要介紹:node
"react-native-viewpager": "^0.2.1",
"react-native-scrollable-tab-view": "0.6.0",
"react-native-sound": "^0.8.3",
"react-native-fs": "^2.0.1-rc.2",複製代碼
是一個viewpager,one項目中的首頁、文章頁、音樂頁均使用了viewpager,使用率很高,先看一個demo:react
<ViewPager
dataSource={this.state.banners}
renderPage={this.renderBanners}
isLoop={true}
autoPlay={true}
/>複製代碼
dataSource定義數據源,其數據源的定義過程是:android
var bannerDataSource = new ViewPager.DataSource({
pageHasChanged: (p1, p2) => p1 !== p2,
});
banners: bannerDataSource.cloneWithPages([]),複製代碼
renderPage用於展現每一個pager的界面ios
renderBanners(data, pageID) {
return (
<Image style={{ height: 140, width: deviceWidth, }} source={{uri: data.cover}}> </Image>
);
}複製代碼
isLoop 是否輪播git
autoPlay 是否自動播放github
renderPageIndicator定義indicator的樣式 ,固然可使用default的樣式,這裏是一個示例,隱藏掉indicator:redux
renderPageIndicator={()=>(<View style={{width: 0, height: 0}}></View>)}複製代碼
react-native-scrollable-tab-view用於定義應用的主tab,項目中主要定義了one的四個tab,能夠滑屏幕切換界面,在項目中因爲各個子界面自身有左右切換的需求,所以關閉了該功能。
部分設置:
renderTabBar
自定義tabbar,如項目中自定義了四個tab的樣式onChangeTab
當tab切換時回調locked
是否鎖定,鎖定時不能左右滑動page
設置選中的tab
項目使用示例:
<ScrollableTabView initialPage={0} locked={true} prerenderingSiblingsNumber={1} tabBarPosition="bottom"
renderTabBar={()=><FacebookTabBar tabIcons={this.tabIcons}/>}>
<OneHome tabLabel="首頁"/>
<OneRead tabLabel="閱讀"/>
<OneMusic tabLabel="音樂"/>
<OneFilm tabLabel="電影"/>
</ScrollableTabView>複製代碼
這兩個主要用於one音樂的播放,其中react-native-fs主要用於音樂的下載,react-native-sound用於本地文件的播放,這兩個庫都用到了原生方法,所以須要分別在android和ios項目中進行設置使用:
1.
2.
include ':app'
include ':react-native-fs'
project(':react-native-fs').projectDir = new File(settingsDir, '../node_modules/react-native-fs/android')
include ':RNSound', ':app'
project(':RNSound').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-sound/android')複製代碼
compile project(':react-native-fs')
compile project(':RNSound')複製代碼
注意添加位置要正確,對代碼進行從新編譯,在Android目錄機構下便可以看到RNSound、react-native-fs兩個module。
兩個lib在react-native 中的使用比較簡單,能夠參考one項目中的使用:react-native-sound 和react-native-fs的使用
var whoosh = new Sound('whoosh.mp3', Sound.MAIN_BUNDLE, (error) => {
if (error) {
console.log('failed to load the sound', error);
} else { // loaded successfully
console.log('duration in seconds: ' + whoosh.getDuration() +
'number of channels: ' + whoosh.getNumberOfChannels());
}
});複製代碼
其中'whoosh.mp3'爲相對路徑,Sound.MAIN_BUNDLE爲基本路徑,在ios中可用,可是在android中提示找不到路徑,最終第一個參數設置絕對路徑,第二個參數設置爲 '' 空串。musicHandler = new Sound(`${RNFS.DocumentDirectoryPath}/music.mp3`, '',(error) => {
if (error) {
console.log('failed to load the sound', error);
} else { // loaded successfully
this.playSound();
}
});複製代碼
須要在sound建立成功的回調中啓動播放,不能夠直接寫在建立的語句以後。4.gif圖問題
ios的Image支持直接播放gif圖,android須要添加lib,在build.gradle的dependencies中添加:
compile 'com.facebook.fresco:animated-gif:0.12.0'//for gif複製代碼
5.佈局問題
目前項目中還有較多的問題,尤爲是Android端,以後還會繼續進行完善。根據目前的開發體驗,感受react native很是適合於展現類型的app,開發效率很是高,可是在Android上體驗要低於ios,有很大的優化空間。
接下來在繼續完善項目的基礎上,繼續學習相關的知識,爭取作出本身的東西,實如今React-native項目入門與思考中立下的flag。
歡迎關注公衆號wutongke,天天推送移動開發前沿技術文章:
推薦閱讀:
React-native項目入門與思考
React native 項目入門(知乎日報,豆瓣電影,[one]一個)
React native 項目進階(redux, redux saga, redux logger)
React Native 項目2(One 【一個】客戶端)