React Native 用法介绍

React Native 用法介绍

一、简介

React Native是Facebook的一个开源框架,RN提供了是一种更高效更低成本的开发方式,用RN开发的页面具有跨平台、易扩展、运行流畅并且支持动态更新等特点。

通过一个例子来了解RN的基本用法,包括JS布局、页面跳转、网络请求等内容

二、示例

实现用户登录操作,输入用户名密码点击登录按钮跳转到用户资料页,点击返回可回到登录页。

// LoginPageComponent.js(登录页)

// ProfilePageComponent.js(用户资料页)

首先页面入口是index.android.js,每一个JS页面对应一个Component,页面在render()中完成渲染,而页面跳转是通过Navigator来实现的,在Navigator指定默认显示的页面,这里是LoginPageComponent,configureScene设置页面跳转动画,route.params携带页面参数,代码如下:

//index.android.js

import React, { Component } from 'react';
import {
  AppRegistry,
  Navigator
} from 'react-native';

import LoginPageComponent from "./LoginPageComponent";
export default class AwesomeProject extends Component {
  constructor(props) {
    super(props);
  }
  render() {  
        let defaultName = 'LoginPageComponent';  
        let defaultComponent = LoginPageComponent;  
        return (  
           <Navigator  
              //这个指定了默认的页面
              initialRoute={{ name: defaultName, component: defaultComponent }}  
              //这个是页面之间跳转时候的动画,具体有哪些?可以看这个目录下
              configureScene={(route) => {
                return Navigator.SceneConfigs.HorizontalSwipeJumpFromRight;  
              }}  

              renderScene={(route, navigator) => {  
                let Component = route.component;
                //navigator作为props传递给了这个component 
                return <Component {...route.params} navigator={navigator} />  
              }} />  
        );  
    }
}

AppRegistry.registerComponent('AwesomeProject', () => AwesomeProject);

在看下登录页的实现,输入框使用TextInput,按钮用的Button,点击按钮响应_pressLogin接口,并通过fetch调用登录接口,接口返回登录成功,则调用navigator.push跳转到ProfilePageComponent.js,传递参数:name、pwd。

// LoginPageComponent.js
import React, { Component } from 'react';  
import {  
  AppRegistry,  
  StyleSheet,  
  Text,  
  Navigator,  
  TouchableOpacity,  
  View,
  Button,
  Alert,
  TextInput
} from 'react-native';  

import ProfilePageComponent from "./ProfilePageComponent";  

export default class LoginPageComponent extends Component {  

    constructor(props){  
      super(props);  
      this.state = {
        name:'',
        pwd:''
      };

    }

    render() {  

      return (
          <View style={styles.counter}>  
            <Text style={styles.titleStyle}>登录</Text>
            <TextInput
              style={styles.inputStyle}
              underlineColorAndroid='transparent'
              placeholder="input userName"
              onChangeText={(name) => this.setState({name})}/>

            <TextInput
              style={styles.inputStyle}
              underlineColorAndroid='transparent'
              placeholder="input password"
              onChangeText={(pwd) => this.setState({pwd})}/>

             <Button
              onPress={()=>{
                this._pressLogin();
              }}
              title="Submit"
              accessibilityLabel="See an informative alert"/>

          </View>  
      );

    }  

    _pressLogin(){
      console.log("click login button");
      if (this.state.name.trim().length == 0) {
        Alert.alert("please input user name");
        return;
      }

      if (this.state.pwd.trim().length == 0) {
        Alert.alert("please input password");
        return;
      }
      var formData = new FormData();
      formData.append("name", this.state.name.trim());
      formData.append("pwd", this.state.pwd.trim());

      fetch("http://10.4.33.125:8080/DemoApi/login",{method:'POST',
        body:formData})
      .then((response) => response.json())
      .then((responseData) => {
        var obj = JSON.parse(JSON.stringify(responseData));
        if (obj.code == 200) {
          const {navigator} = this.props;  
          if(navigator) {
            navigator.push({
                name: 'ProfilePageComponent',  
                component: ProfilePageComponent,
                params:{  
                    name: this.state.name,  
                    pwd: this.state.pwd
                }
            })
        } else {
          Alert.alert("账号密码错误");
        }
      }

      }).catch((error) => { 
       console.log(error);
      }).done();


    }  
}  

const styles = StyleSheet.create({  
    counter:{  
      flex:1, 
      backgroundColor:'#e8e8e8',
      padding:20
    },
    titleStyle:{
      height:50,
      color: 'blue',
      fontSize: 30,
      textAlign:'center',
      marginTop:80,
      marginBottom:10
    },
    inputStyle:{
      backgroundColor:'#fff',
      height:35,
      marginBottom:20,
      padding:10,
    }

});  

最后到用户信息页面,通过navigator.pop();回到登录页

 // ProfilePageComponent.js
import React, { Component } from 'react';  
import {  
  AppRegistry,  
  StyleSheet,  
  Text,  
  Navigator,  
  TouchableOpacity,  
  View  
} from 'react-native';  

import LoginPageComponent from './LoginPageComponent';  

export default class ProfilePageComponent extends Component {  

    constructor(props){  
      super(props);  
      this.state = {  
          name: '',
          pwd:''
      };
    }

    _pressButton() {
        const {navigator} = this.props;
        if (navigator) {  
            //把当前的页面pop掉,这里就返回到了上一个页面:LoginPageComponent  
            navigator.pop();
        }
    }

    componentDidMount() {  
      this.setState({name:this.props.name});
      this.setState({pwd:this.props.pwd});
    }  

    render() {  
        return (  
            <View style={styles.counter}>  
                <Text>用户名:{this.state.name}, 密码:{this.state.pwd}</Text>  
                <TouchableOpacity onPress={()=>{this._pressButton()}}>  
                    <Text>点我跳回去</Text>
                </TouchableOpacity>
            </View>
        );  
    }

}

const styles = StyleSheet.create({  
    counter:{  
      flex:1,  
      justifyContent:'center',  
      alignItems:'center',  
      backgroundColor:'#e8e8e8'  
    }  
});  

三、打包APK

1.生成签名文件,-alias对应的别名自己命名,这里是cy-key

$ keytool -genkey -v -keystore my-release-key.keystore -alias cy-key -keyalg RSA -keysize 2048 -validity 10000

这条命令会要求你输入密钥库(keystore)和对应密钥的密码,然后设置一些发行相关的信息。最后它会生成一个叫做my-release-key.keystore的密钥库文件。

2.把my-release-key.keystore文件放到你工程中的android/app文件夹下。

3.编辑~/.gradle/gradle.properties,添加如下的代码(注意把其中的星号替换为相应密码)

MYAPP_RELEASE_STORE_FILE=my-release-key.keystore
MYAPP_RELEASE_KEY_ALIAS=cy-key
MYAPP_RELEASE_STORE_PASSWORD=*****
MYAPP_RELEASE_KEY_PASSWORD=*****

4.添加签名到应用的gradle配置文件#android/app/build.gradle

android {
    ...
    defaultConfig { ... }
    signingConfigs {
        release {
            storeFile file(MYAPP_RELEASE_STORE_FILE)
            storePassword MYAPP_RELEASE_STORE_PASSWORD
            keyAlias MYAPP_RELEASE_KEY_ALIAS
            keyPassword MYAPP_RELEASE_KEY_PASSWORD
        }
    }
    buildTypes {
        release {
            ...
            signingConfig signingConfigs.release
        }
    }
}

5.将js文件打包成bundle,存放到assets目录下,执行assembleRelease打包apk

$ mkdir -p android/app/src/main/assets
$ react-native bundle --platform android --dev false --entry-file index.android.js \
  --bundle-output android/app/src/main/assets/index.android.bundle \
  --assets-dest android/app/src/main/res/

// windows
$ cd android && ./gradlew assembleRelease

// mac
$ cd android && gradle assembleRelease

RN环境搭建和JS相关参考如下

1.RN环境搭建
https://reactnative.cn/docs/0.45/getting-started.html#content

2.打包apk
http://reactnative.cn/docs/0.27/signed-apk-android.html

3.JS入门
http://es6.ruanyifeng.com/#docs/intro

4.JS在线编译
http://jsrun.net/new

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

chengyuan9160

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值