前阵子开始学习 React Native,一个人摸滚带爬的也算是能写个 小项目 了,在这里分享一下自己从零开始学习的过程,也推荐一些比较优秀的学习资源,让大家学习过程可以提高一些效率。
React Native 环境搭建可以看 官网 ,也可以去看笔者的 上篇文章 ,接下去是IDE 选型和配置的环节,有几种比较不错的 IDE:
笔者选择了 WebStorm ,只有一个原因,那就是它和 Andoid Studio 很像(笔者是 Andorid Developer)。
因为没接触过 Web 前端这一块,所以第一天去学习了 JavaScript、html 和 css 一些基础的知识。记得那天疯狂的找学习的资料,刚开始在极客学院、慕课网这些学习网站上学习了一会,后面在知乎上还是 google 搜索到阮一峰大神的 es6 教程,非常不错。同时,也推荐 MDN ,也是不错的学习 JavaScript 的地方。当时学习了一两天这些基础的知识,有了初步的了解。
接下去就开始疯狂的搜索 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 (
60, overflow: 'hidden' }}>
'home'}
title="首页"
titleStyle={{color: 'rgb(169,183,183)', fontSize: 11}}
selectedTitleStyle={{color: 'rgb(234,128,16)', fontSize: 11}}
renderIcon={() => './images/home_normal.png')}/>}
renderSelectedIcon={() => './images/home_selected.png')}/>}
//badgeText ="1"
onPress={() => this.setState({selectedTab: 'home'})}
>
< Home {...this.props}/>
'recommend'}
title="推荐"
titleStyle={{color: 'rgb(169,183,183)', fontSize: 11}}
selectedTitleStyle={{color: 'rgb(234,128,16)', fontSize: 11}}
renderIcon={() => './images/recommend_normal.png')}/>}
renderSelectedIcon={() => './images/recomm_selected.png')}/>}
onPress={() => this.setState({selectedTab: 'recommend'})}
>
< Recommend {...this.props} />
'mine'}
title="我的"
titleStyle={{color: 'rgb(169,183,183)', fontSize: 11}}
selectedTitleStyle={{color: 'rgb(234,128,16)', fontSize: 11}}
renderIcon={() => './images/mine_normal.png')}/>}
renderSelectedIcon={() => './images/mine_selected.png')}/>}
onPress={() => this.setState({selectedTab: 'mine'})}
>
< Mine { ...this.props }/>
);
}
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 组件
this.state.dataSource}
renderRow = {this._renderItem.bind(this)}
onEndReached={this._loadMore.bind(this)}
renderFooter={this._renderFooter.bind(this)}
onEndReachedThreshold = {29}
refreshControl={
this.state.isRefreshing}
onRefresh={this._refresh.bind(this)}
tintColor='#aaaaaa'
title='Loading...'
progressBackgroundColor='#aaaaaa'/>
}>
4.导航条的设置,使用 react-native-navbar 实现。使用示例如下:
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,
});
}