码迷,mamicode.com
首页 > 其他好文 > 详细

react-native入门

时间:2016-05-08 18:20:24      阅读:291      评论:0      收藏:0      [点我收藏+]

标签:

react-native入门

react native的强大牛逼之处就不扯了,直接进入主题,谈谈自己初次接触react native的学习经验,写一个简单的入门文档,便于总结学习知识,分享学习中遇到和解决的坑,由于我是做android开发的,因此该文主要针对android开发环境进行讲解,基于win7系统。

重点参考以下网址和书籍

1. 环境搭建

搭建过程参考“React Native中文网”上的讲解,这里详细说明一下android环境搭架过程。考虑到作为一名android开发人员,androidstudio以及对应的sdk等android开发环境都应该会搭架(或者自己百度android开发环境搭建),默认android环境处于搭建好的状态。

1.1.三步搞定

  • step1 安装Node.js
    访问node.js官网:https://nodejs.org/en/,下载最新的稳定版本,这里我下载的是v4.4.4LTS,下载下来后双击安装即可。
  • step2 安装react-native
    如果node.js已经安装好,以及对应的环境变量配置没有问题,直接运行该语句即可:npm install -g react-native-cli
  • step3 生成react-native开发工程
    react-native init AwesomeProject

    备注:AwesomeProject为你的工程名,自己随意写。

1.2.注意事项

  • 由于众所周知的网络原因,react-native命令行从npm官方源拖代码时会遇上麻烦。请将npm仓库源替换为国内镜像,否则很有可能step3不能成功,或者耗时过长:
    npm config set registry https://registry.npm.taobao.org
    npm config set disturl https://npm.taobao.org/dist

    react-native init一个工程的时间本来就比较长,请耐性等待(不要过早认为失败了),我在win7上init大概需要4分钟左右。

1.3.结束

是的,如果你本身就使用androidstudio进行android应用开发,这只需要这几步,就完成了react native的开发环境搭建,当然,考虑到断点调试,你还需要安装chome浏览器以及对应的插件:

2.开发走起

好吧,虽然我们环境已经搭建完成,但是选用一个合适的编辑器还是很重要的,不然敲着代码都不顺心,这里我使用的webstorm,并使用对应的提示插件:https://github.com/virtoolswebplayer/ReactNative-LiveTemplate

2.1.万事俱备,开始敲代码

写一个helloworld实在太简单,只需要改改之前生成的工程的字符串就搞定了,因此就不写helloworld了,直接参考《深入浅出 React Native:使用 JavaScript 构建原生应用》这篇文章开始实践。由于在实践过程中仅仅只看了这篇文章,没有看它的源码,所以觉得自己好坑,读者遇到问题时,可以尝试看源码解决。

  • index,android.js
  1. import React, {
  2. AppRegistry,
  3. Component,
  4. Navigator
  5. } from ‘react-native‘;
  6. import SearchPage from ‘./js/SearchPage‘;
  7. class PropertyFinder extends Component {
  8. render() {
  9. return (
  10. <Navigator
  11. initialRoute={{title: ‘SearchPage‘,component: SearchPage}}
  12. configureScene={(route) => {
  13. return Navigator.SceneConfigs.VerticalDownSwipeJump;
  14. }}
  15. renderScene={(route, navigator) => {
  16. let SearchPage = route.component;
  17. return <SearchPage {...route.params} navigator={navigator} />;
  18. }}/>
  19. );
  20. }
  21. }
  22. AppRegistry.registerComponent(‘PropertyFinder‘, () => PropertyFinder);

这里直接使用了es6的最新语法进行编写,以前没有怎么写js代码,不过感觉这样的语法结构更容易适应,爽歪歪。

  • 第1行
    import语句后的React导入的react-native模块中的默认导出内容(export default xxx)。这里特别结实一下,刚开始没看懂这个语法。
  • 第10行
    如其名字render意思,该函数为该组件的渲染函数,渲染整个组件的显示。
  • 第25行
    组成入口组件,注意函数的第一个参数名字不能随便修改,它与android原生代码中的getMainComponentName保持一致,第二个参数名嘛,只要是一个Component就行了,名字无所谓。

2.2.重点解释Navigator

Navigator与android系统中的activity栈的作用类似。

  • initialRoute
    它定义了Navigator的初始化组件,该组件将在应用启动时加载。
  • configureScene
    配置界面与界面之间跳转时的动画效果
  • renderScene
    渲染对应的组件

2.3.坑点

第19行的 {…route.params},到目前为止,我还不怎么了解它的原理,仅仅是了解它的作用(ps:刚学习,对jsx理解不深刻),这段代码定义了一个组件跳转到另一个组件时,传递对象数据的名称,后续所有的界面跳转都需要和改名字保持一致,本文使用了params,那么再进行跳转时,传递的参数名必须为params,例如:

  1. this.props.navigator.push({
  2. title: ‘Results‘,
  3. component: SearchResults,
  4. params: {listings: response.listings}
  5. });

3.布局

react-native的布局与html与css的思想保持一致,例如:html5使用html标签描述文档结构,使用css对文档表现进行渲染,而react-native使用自己的组件进行界面结构描述,使用类似于css的语法进行界面表示描述。

  1. /**
  2. * Created by zjh on 2016/5/5.
  3. */
  4. import React, {
  5. StyleSheet,
  6. Text,
  7. View,
  8. TextInput,
  9. TouchableHighlight,
  10. Image,
  11. ProgressBarAndroid,
  12. Component
  13. } from ‘react-native‘;
  14. import SearchResults from ‘./SearchResults‘;
  15. class SearchPage extends Component {
  16. // 构造
  17. constructor(props) {
  18. super(props);
  19. // 初始状态
  20. this.state = {
  21. searchString: ‘london‘,
  22. isLoading: false,
  23. message: ‘‘
  24. };
  25. }
  26. render() {
  27. console.log(‘SearchPage.render‘);
  28. var spinner = this.state.isLoading ? (<ProgressBarAndroid styleAttr="Inverse" />) : (<View/>);
  29. return (
  30. <View style={styles.container}>
  31. <Text style={styles.decription}>Search for houses to buy!</Text>
  32. <Text style={styles.decription}>Search by place-name, postcode or search near your location.</Text>
  33. <View style={styles.flowRight}>
  34. <TextInput
  35. style={styles.searchInput}
  36. value={this.state.searchString}
  37. onChangeText={this.onSearchTextChanged.bind(this)}
  38. placeholder=‘Search via name or postcode‘/>
  39. <TouchableHighlight
  40. onPress={this.onSearchPressed.bind(this)}
  41. style={styles.button}>
  42. <Text style={styles.buttonText}>Go</Text>
  43. </TouchableHighlight>
  44. </View>
  45. <TouchableHighlight style={styles.button} onPress={this.onLocationPressed.bind(this)} >
  46. <Text style={styles.buttonText}>Location</Text>
  47. </TouchableHighlight>
  48. <Image source={require(‘./image/house.png‘)} />
  49. {spinner}
  50. <Text style={styles.decription}>{this.state.message}</Text>
  51. </View>
  52. );
  53. }
  54. onSearchTextChanged(text) {
  55. console.log(‘onSearchTextChanged‘);
  56. this.setState({searchString: text});
  57. console.log(this.state.searchString);
  58. }
  59. _executeQuery(query) {
  60. console.log(query);
  61. this.setState({isLoading: true});
  62. fetch(query)
  63. .then(response => response.json())
  64. .then(json => this._handleResponse(json.response))
  65. .catch(error => this.setState({
  66. isLoading: false,
  67. message: ‘Something bad happened: ‘ + error
  68. }));
  69. }
  70. _handleResponse(response) {
  71. this.setState({isLoading: false, message: ‘‘});
  72. if (response.application_response_code.substr(0, 1) === ‘1‘) {
  73. //console.log(‘Properties found: ‘ + response.listings.length);
  74. this.props.navigator.push({
  75. title: ‘Results‘,
  76. component: SearchResults,
  77. params: {listings: response.listings}
  78. });
  79. } else {
  80. this.setState({message: ‘Location not recognized; please try again.‘});
  81. }
  82. }
  83. onSearchPressed() {
  84. console.log(‘onSearchPressed‘);
  85. var query = urlForQueryAndPage(‘place_name‘, this.state.searchString, 1);
  86. this._executeQuery(query);
  87. }
  88. onLocationPressed() {
  89. navigator.geolocation.getCurrentPosition(
  90. location => {
  91. var search = location.coords.latitude + ‘,‘ + location.coords.longitude;
  92. this.setState({searchString: search});
  93. var query = urlForQueryAndPage(‘centre_point‘, search, 1);
  94. this._executeQuery(query);
  95. },
  96. error => {
  97. this.setState({
  98. message: ‘There was a problem with obtaining your location: ‘ + error
  99. });
  100. }
  101. );
  102. }
  103. }
  104. function urlForQueryAndPage(key, value, pageNumber) {
  105. var data = {
  106. country: ‘uk‘,
  107. pretty: ‘1‘,
  108. encoding: ‘json‘,
  109. listing_type: ‘buy‘,
  110. action: ‘search_listings‘,
  111. page: pageNumber
  112. };
  113. data[key] = value;
  114. var queryString = Object.keys(data)
  115. .map(key => key + ‘=‘ + encodeURIComponent(data[key]))
  116. .join(‘&‘);
  117. return ‘http://api.nestoria.co.uk/api?‘ + queryString;
  118. }
  119. var styles = StyleSheet.create({
  120. decription: {
  121. marginBottom: 20,
  122. fontSize: 18,
  123. textAlign: ‘center‘,
  124. color: ‘#656565‘
  125. },
  126. container: {
  127. padding: 30,
  128. marginTop: 65,
  129. alignItems: ‘center‘
  130. },
  131. flowRight: {
  132. flexDirection: ‘row‘,
  133. alignItems: ‘center‘,
  134. alignSelf: ‘stretch‘
  135. },
  136. buttonText: {
  137. fontSize: 18,
  138. color: ‘white‘,
  139. alignSelf: ‘center‘
  140. },
  141. button: {
  142. height: 36,
  143. flex: 1,
  144. flexDirection: ‘row‘,
  145. backgroundColor: ‘#48BBEC‘,
  146. borderColor: ‘#48BBEC‘,
  147. borderWidth: 1,
  148. borderRadius: 8,
  149. marginBottom: 10,
  150. alignSelf: ‘stretch‘,
  151. justifyContent: ‘center‘
  152. },
  153. searchInput: {
  154. height: 36,
  155. padding: 4,
  156. marginRight: 5,
  157. flex: 4,
  158. fontSize: 18,
  159. borderWidth: 1,
  160. borderColor: ‘#48BBEC‘,
  161. borderRadius: 8,
  162. color: ‘#48BBEC‘
  163. },
  164. image: {
  165. width: 217,
  166. height: 138
  167. }
  168. });
  169. export default SearchPage;

3.1.常用布局组件与渲染熟悉

react-native提供了大量的组件,例如VIew、Text、Image等等,详细的使用方法,请参考《React Native中文网》中的内容。

3.2.坑点

虽然这里的界面渲染语法与css保持一致,比较react-native不是运行在浏览器上,因此它支持的也仅仅是一个子集而已。

  • flex
    该属性,在进行多设备界面适配时,会使用得很多,我遇到一个坑,没有设置父组件为alignSelf: ‘stretch’,导致子组件虽然设置了alignSelf: ‘stretch’和对应的flex值,但是却没有按照比例正常显示的情况。

4.全文结束

是的,在这里就结束了,掌握的知识不多,入门确实也就是这么简单。





react-native入门

标签:

原文地址:http://www.cnblogs.com/zhoujunhua/p/5470908.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!