React-Native for Android
React-Native Android
尽管Native开发成本更高,但现阶段Native仍然是必须的,因为Web的用户体验仍无法超越Native: 天猫技术–关于React-Native 1.环境React Native只支持在OS X系统,React Native开发的app 要求客户端os >= Android 4.1 (API 16) 和>= iOS 7.0 1.1 工具
1.2 SDK 环境要求
1.3 Demo Hello World$ npm install -g react-native-cli
$ react-native init AwesomeProject
$ cd AwesomeProject/
$ react-native run-android
相应的会在目录AwesomeProject/android/app下创建Android Studio工程,AwesomeProject/iOS/AwesomeProject.xcodeproj目录中创建XCode工程
2.概念2.1 Component组件React Native 主要是通过 Virtual Dom 来实现显示页面或者页面中的模块。可以通过 React.createClass() 来创建自己的 Dom,在 React 中称之为组件(Component) 1. 创建组件// Android
var React = require('react-native');
var { DrawerLayoutAndroid,ProgressBarAndroid } = React;
var App = React.createClass({
render: function() {
return (
<DrawerLayoutAndroid
renderNavigationView={() => <Text>React Native</Text>}>
<ProgressBarAndroid />
</DrawerLayoutAndroid>
);
},});
// 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>
);
},});
2. 使用组件 类似 HTML 标准标签 3. 组件生命周期 React 组件的数据保存在自己内部的 state 变量中.都有相应回调。 4. 自定义组件render 函数是必须的,其他可选 var MyCustomComponent = React.createClass({
getInitialState: function() {
// 这里返回一个对象,设置组件的初始化状态,后面就可以通过 this.state 来获得这个对象
return {
key1: data1,key2: data2,...
};
},componentWillMount: function() {
// 这里一般做一些和界面显示无关的初始化操作
},componentDidMount: function() {
// 这里一般做加载数据的操作
},render: function() {
// 这是最重要的函数,用来绘制界面,所有的自定义组件,这个函数是必须提供的
return(
<View>
...
</View>
);
},});
5. 组件数据根据组件的状态 state 来绘制动态页面 render: function() {
return(
//把状态中的 key1 的值用 Text 组件直接显示
<Text>{this.state.key1}</Text>
);
}
状态(statu) 组件的状态(statu) 除了使用 getInitialState 方法来设置初始化状态外,在界面逻辑处理或者事件交互的过程中, 属性(Property)属性(Property)可以通过 this.props 来直接获取 <View style={{flex: 1}}>
区别: 一般 属性 表示静态的数据,组件创建后,就基本不变的内容,状态 是动态数据。 3.React Native布局React Native 的布局,实用的是 FlexBox 实现,类似网页的 CSS 布局方法
示例Demo: 知乎日报客户端 4.Android Studio示例工程概览MainActivity 已经针对React Native做了一层封装调用,默认帮我们维护了React Native的生命周期。 import android.app.Activity;
import android.os.Bundle;
import android.view.KeyEvent;
import com.facebook.react.LifecycleState;
import com.facebook.react.ReactInstanceManager;
import com.facebook.react.ReactRootView;
import com.facebook.react.modules.core.DefaultHardwareBackBtnHandler;
import com.facebook.react.shell.MainReactPackage;
import com.facebook.soloader.SoLoader;
public class MainActivity extends Activity implements DefaultHardwareBackBtnHandler {
private ReactInstanceManager mReactInstanceManager;
private ReactRootView mReactRootView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mReactRootView = new ReactRootView(this);
mReactInstanceManager = ReactInstanceManager.builder()
.setApplication(getApplication())
.setBundleAssetName("index.android.bundle")
.setJSMainModuleName("index.android")
.addPackage(new MainReactPackage())
.setUseDeveloperSupport(BuildConfig.DEBUG)
.setInitialLifecycleState(LifecycleState.RESUMED)
.build();
mReactRootView.startReactApplication(mReactInstanceManager,"AwesomeProject",null);
setContentView(mReactRootView);
}
@Override
public boolean onKeyUp(int keyCode,KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_MENU && mReactInstanceManager != null) {
mReactInstanceManager.showDevOptionsDialog();
return true;
}
return super.onKeyUp(keyCode,event);
}
@Override
public void invokeDefaultOnBackPressed() {
super.onBackPressed();
}
@Override
protected void onPause() {
super.onPause();
if (mReactInstanceManager != null) {
mReactInstanceManager.onPause();
}
}
@Override
protected void onResume() {
super.onResume();
if (mReactInstanceManager != null) {
mReactInstanceManager.onResume(this);
}
}
}
index.android.js **
* Sample React Native App
* https://github.com/facebook/react-native
*/
'use strict';
var React = require('react-native');
var {
AppRegistry,StyleSheet,Text,View,} = React;
var AwesomeProject = React.createClass({
render: function() {
return (
<View style={styles.container}>
<Text style={styles.welcome}>
Welcome to React Native!
</Text>
<Text style={styles.instructions}>
To get started,edit index.android.js
</Text>
<Text style={styles.instructions}>
Shake or press menu button for dev menu
</Text>
</View>
);
}
});
var styles = StyleSheet.create({
container: {
flex: 1,justifyContent: 'center',alignItems: 'center',backgroundColor: '#F5FCFF',},welcome: {
fontSize: 20,textAlign: 'center',margin: 10,instructions: {
textAlign: 'center',color: '#333333',marginBottom: 5,});
AppRegistry.registerComponent('AwesomeProject',() => AwesomeProject);
package.json 是工程的依赖和元数据配置文件: {
"name": "AwesomeProject","version": "0.0.1","private": true,"scripts": { "start": "node_modules/react-native/packager/packager.sh" },"dependencies": { "react-native": "^0.11.0" } }
5.打包发布独立安装包
目前 iOS 应用可用 react-native bundle 命令进行打包,android暂时没有支持。 5.1 react-native-gradle 插件借助插件 react-native-gradle:com.facebook.react:gradleplugin:1.0.+ 可完成混淆及资源打包。(插件并没有发布到 JCenter 或者 Maven Centry)插件源码github地址
项目中使用build.gradle配置: buildscript {
repositories {
mavenLocal() // 本地依赖
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:1.3.0'
classpath 'com.facebook.react:gradleplugin:1.0.+' // 插件依赖
}
}
app/build.gradle配置: apply plugin: 'com.facebook.react'
react {
bundleFileName "index.android.bundle" // assets 目录下 js 文件名
bundlePath "/index.android.bundle" // js 路径
jsRoot "../" // js 源文件位置
packagerHost "localhost:8081" // debug server 地址
packagerCommand "./node_modules/react-native/packager/packager.sh" // 打包命令地址
devParams {
skip true
dev true
inlineSourceMap false
minify false
runModule true
}
releaseParams {
skip false
dev false
inlineSourceMap false
minify true
runModule true
}
}
Params参数:
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |