Facebook React Native 中文教程一:介绍

React Native 中文版

Facebook 在 [React.js Conf 2015](http://conf.reactjs.com/) 大会上推出了基于 JavaScript 的开源框架 [React Native](http://facebook.github.io/react-native/),本中文教程翻译自 [React Native 官方文档](http://facebook.github.io/react-native/docs/getting-started.html)。

React Native 结合了 Web 应用和 Native 应用的优势,可以使用 JavaScript 来开发 iOS 和 Android 原生应用。在 JavaScript 中用 React 抽象操作系统原生的 UI 组件,代替 DOM 元素来渲染等。

React Native 使你能够使用基于 JavaScript 和 [React](http://wiki.jikexueyuan.com/project/react/) 一致的开发体验在本地平台上构建世界一流的应用程序体验。React Native 把重点放在所有开发人员关心的平台的开发效率上——开发者只需学习一种语言就能轻易为任何平台高效地编写代码。Facebook 在多个应用程序产品中使用了 React Native,并将继续为 React Native 投资。

[React Native 入门](http://wiki.jikexueyuan.com/project/react-native/getting-started.html)

原生的 iOS 组件

有了 ReactNative,你可使用标准平台组件,比如 iOS 平台上的 UITabBar 和 UINavigationController。这可以让你的应用程序拥有和原生平台一致的外观和体验,并保持较高的品质。使用相应的 React 组件,如 iOS 标签栏和 iOS 导航器,这些组件可以轻松并入你的应用程序中。

var React = require(‘react-native‘);

var { TabBarIOS, NavigatorIOS } = React;

var App = React.createClass({

render: function() {

return (

<TabBarIOS>

<TabBarIOS.Item title="React Native" selected={true}>

<NavigatorIOS initialRoute={{ title: ‘React Native‘ }} />

</TabBarIOS.Item>

</TabBarIOS>

);

},

});

异步执行

JavaScript 应用代码和原生平台之间所有的操作都是异步执行,并且原生模块也可以使用额外线程。这意味着我们可以解码主线程图像,并将其在后台保存至磁盘,在不阻塞 UI 的情况下进行文本和布局的估量计算,等等。因此,React Native 应用程序的流畅度和响应性都非常好。通信也是完全可序列化的,当运行完整的应用程序时,这允许我们使用 Chrome Developer Tools 来调试 JavaScript,或者在模拟器中,或者在真机上。

见 [调试](http://wiki.jikexueyuan.com/project/react-native/debugging.html)

触摸处理

iOS 有一个非常强大的系统称为 Responder Chain,可以用来响应复杂视图层级中的事件,但是在 Web 中并没有类似功能的工具。React Native 可实现类似的响应系统并提供高水平的组件,比如 TouchableHighlight,无需额外配置即可与滚动视图和其他元素适度整合。

var React = require(‘react-native‘);

var { ScrollView, TouchableHighlight, Text } = React;

var TouchDemo = React.createClass({

render: function() {

return (

<ScrollView>

<TouchableHighlight onPress={() => console.log(‘pressed‘)}>

<Text>Proper Touch Handling</Text>

</TouchableHighlight>

</ScrollView>

);

},

});

弹性框和样式

布局视图应该是简单的,所以我们将 Web 平台上的弹性框模块引入了 React Native。弹性框可用来搭建最常用的 UI 布局,比如代用边缘和填充的堆叠和嵌入。React Native 还支持常见的 Web 样式,比如 fontWeight 和 StyleSheet 抽象,它们提供了一种优化机制来宣称你所有的样式和布局在组件中的应用是正确的,且组件把它们应用到了内网中。

var React = require(‘react-native‘);

var { Image, StyleSheet, Text, View } = React;

var ReactNative = React.createClass({

render: function() {

return (

<View style={styles.row}>

<Image

source={{uri: ‘http://facebook.github.io/react/img/logo_og.png‘}}

style={styles.image}

/>

<View style={styles.text}>

<Text style={styles.title}>

React Native

</Text>

<Text style={styles.subtitle}>

Build high quality mobile apps using React

</Text>

</View>

</View>

);

},

});

var styles = StyleSheet.create({

row: { flexDirection: ‘row‘, margin: 40 },

image: { width: 40, height: 40, marginRight: 10 },

text: { flex: 1, justifyContent: ‘center‘},

title: { fontSize: 11, fontWeight: ‘bold‘ },

subtitle: { fontSize: 10 },

});

Polyfills

React Native 的重点是改变视图代码编写的方式。接下来,我们注意网络中普遍的并把那些 API 放在适当的地方。可以使用 npm 安装 JavaScript 库,这些库用于融入到 React Native 中的顶级功能,比如 XMLHttpRequest,window.requestAnimationFrame 及 navigator.geolocation。我们正在扩大可用的 API,并致力于为开源社区做出贡献。

var React = require(‘react-native‘);

var { Text } = React;

var GeoInfo = React.createClass({

getInitialState: function() {

return { position: ‘unknown‘ };

},

componentDidMount: function() {

navigator.geolocation.getCurrentPosition(

(position) => this.setState({position}),

(error) => console.error(error)

);

},

render: function() {

return (

<Text>

Position: {JSON.stringify(this.state.position)}

</Text>

);

},

});

可扩展性

使用 React Native 无需编写一行原生代码即可创建出一款不错的应用程序,并且 React Native 可通过自定义原生视图和模块来进行扩展--也就是说你可以重用你已经构建的任何内容,并且可导入和使用你最喜欢的原生库。为了在 iOS 中创建一个简单的模块,需要创建一个新的类来实现 RCTBridgeModule 协议,并将你想要在 RCT_EXPORT_METHOD 中对 JavaScript 可用的功能包装起来。另外,类本身必须可以用 RCT_EXPORT_MODULE() 显式导出;

// Objective-C

#import "RCTBridgeModule.h"

@interface MyCustomModule : NSObject <RCTBridgeModule>

@end

@implementation MyCustomModule

RCT_EXPORT_MODULE();

// Available as NativeModules.MyCustomModule.processString

RCT_EXPORT_METHOD(processString:(NSString *)input callback:(RCTResponseSenderBlock)callback)

{

callback(@[[input stringByReplacingOccurrencesOfString:@"Goodbye" withString:@"Hello"];]]);

}

@end

// JavaScript

var React = require(‘react-native‘);

var { NativeModules, Text } = React;

var Message = React.createClass({

render: function() {

getInitialState() {

return { text: ‘Goodbye World.‘ };

},

componentDidMount() {

NativeModules.MyCustomModule.processString(this.state.text, (text) => {

this.setState({text});

});

},

return (

<Text>{this.state.text}</Text>

);

},

});

自定义的 iOS 视图可以通过子类化 RCTViewManager,实现 -(UIView *)view 方法并用 RCT_EXPORT_VIEW_PROPERTY 宏导出属性的办法来公开。然后一个简单的 JavaScript 文件会连接这些点。

// Objective-C

#import "RCTViewManager.h"

@interface MyCustomViewManager : RCTViewManager

@end

@implementation MyCustomViewManager

- (UIView *)view

{

return [[MyCustomView alloc] init];

}

RCT_EXPORT_VIEW_PROPERTY(myCustomProperty);

@end

// JavaScript

module.exports = createReactIOSNativeComponentClass({

validAttributes: { myCustomProperty: true },

uiViewClassName: ‘MyCustomView‘,

});

[React Native 入门](http://wiki.jikexueyuan.com/project/react-native/getting-started.html)

> 原文出处:http://wiki.jikexueyuan.com/project/react-native/

时间: 2024-11-05 13:47:40

Facebook React Native 中文教程一:介绍的相关文章

React Native 中 component 生命周期

React Native 中 component 生命周期 转自 csdn 子墨博客  http://blog.csdn.net/ElinaVampire/article/details/51813677 (非原创) React Native中的component跟Android中的activity,fragment等一样,存在生命周期,下面先给出component的生命周期图 getDefaultProps object getDefaultProps() 执行过一次后,被创建的类会有缓存,映

React Native中的网络请求

React Native中的网络请求fetch使用方法最为简单,但却可以实现大多数的网络请求,需要了解更多的可以访问: https://segmentfault.com/a/1190000003810652 /** * Sample React Native App * https://github.com/facebook/react-native * 周少停 2016-09-28 * fetch请求数据 header 参数 response转json 请求方式 */ import React

react native中如何往服务器上传网络图片

1 let common_url = 'http://192.168.1.1:8080/'; //服务器地址 2 let token = ''; //用户登陆后返回的token 3 /** 4 * 使用fetch实现图片上传 5 * @param {string} url 接口地址 6 * @param {JSON} params body的请求参数 7 * @return 返回Promise 8 */ 9 function uploadImage(url,params){ 10 return

[转] 在React Native中使用ART

http://bbs.reactnative.cn/topic/306/%E5%9C%A8react-native%E4%B8%AD%E4%BD%BF%E7%94%A8art 前半个月捣腾了一下React Native ART 现在手上闲下来了和大家分享一下React Native中的ART使用心得 React Native ART 究竟是什么? 所谓ART,是一个在React中绘制矢量图形的JS类库.这个类库抽象了一系统的通用接口,统一了SVG,canvas,VML这类矢量图形在 React中

在 React Native 中使用 Redux 架构

前言 Redux 架构是 Flux 架构的一个变形,相对于 Flux,Redux 的复杂性相对较低,而且最为巧妙的是 React 应用可以看成由一个根组件连接着许多大大小小的组件的应用,Redux 也只有一个 Store,而且只用一个 state 树来管理组件的状态.随着应用逐渐变得复杂,React 将组件看成状态机的优势仿佛变成了自身的绊脚石.因为要管理的状态将会越来越多,直到你搞不清楚某个状态在不知道什么时候,由于什么原因,发生了什么变化.Redux 试图让状态的变化变得可预测.Redux

react native中一次错误排查 Error:Error: Duplicate resources

最近一直在使用react native中,遇到了很多的坑,同时也学习到了一些移动端的开发经验. 今天在做一个打包的测试时,遇到了一个问题,打包过程中报错“Error:Error: Duplicate resources”,什么意思呢,就是打包资源有重复,后来查看了一下,发现打包到android/app/src目录下的静态文件重名了. 重现步骤: 1:通过vscode打开项目,运行打包命令 react-native ram-bundle --entry-file index.js --platfo

在 React Native 中使用 moment.js 無法載入語系檔案

moment.js 是很常見的日期時間 library,友善的 API 與極佳的執行效率是它的兩大賣點.例如 (new Date()).getFullYear(),如果使用 moment.js 我可以只寫 moment().get('year'),可讀性增強許多. 問題 React Native 0.29.x 預設使用 ES6,並支援 import 語法.問題出在如果遵照官方網站的說明去載入語系檔,會發生找不到模組 (cannot find module) 的錯誤.推測可能是 moment.js

react native中Unable to load script from assets &#39;index.android.bundle&#39;解决方案

刚刚朋友问我,说是创建好一个项目,运行后报错:Unable to load script from assets 'index.android.bundle',以前好好的没出现这种现象,于是我找到一个解决方案,分享一下. 解决这个问题的方案是: 进入你该项目的根目录下的 android目录下的app目录下的src文件下的mian文件,(可能说的有点绕),在main件夹下,创建一个assets文件,这个文件是rn的资源文件夹! 之后用dos进入你的项目根目录,执行一下命令: react-nativ

React&#160;Native&#160;中&#160;ScrollView&#160;性能探究

1 基本使用 ScrollView 是 React Native(后面简称:RN) 中最常见的组件之一.理解 ScrollView 的原理,有利于写出高性能的 RN 应用. ScrollView 的基本使用也非常简单,如下: ... 它和 View 组件一样,可以包含一个或者多个子组件.对子组件的布局可以是垂直或者水平的,通过属性 horizontal=true/false 来控制.甚至还默认支持"下拉"刷新操作.另外还有一个特别赞的特性,超出屏幕的 View 会自动被移除,从而节省资