React-Native 二、登录注册模块开发

react-native

前段时间公司项目比较赶, 没时间写文章, 这两天闲下来了, 总结了一下, 写了一篇比较综合的UI项目, 登录注册模块, 包含UI 网络请求等功能, 希望对大家理解React Native的界面布局和网络请求有一定的帮助.

项目可到github下载: https://github.com/YTiOSer/YTReact-Native_LoginUI

1.头文件

这个项目中用到了多个UI控件和导航, 所以需要引入多个控件和React Navigation,导航的使用方法上篇文章已经讲述, 这里就不再讲了,代码如下所示:

import React, { Component } from 'react';
import { createStackNavigator } from 'react-navigation';
import ButtonView from './ButtonView';
import RegistView from './regist/RegistView';

import {
  Platform,
  StyleSheet,
  Text,
  View, 
  TextInput, 
  Button,
  Alert,
  Fetch,
  Dimensions,
} from 'react-native';

2. 封装控件

项目中针对按钮ButtonView进行了封装, 页面中使用的按钮都可以使用封装的控件, 这样方便管理和使用, 代码在ButtonView.js目录下, 具体封装代码如下:

export default class ButtonView extends React.Component {

    static defaultProps = {
        btnName: 'Button',
        underlayColor: 'gray',
    };

    constructor(props) {
        super(props);
    }

  render() {
    return (
        <View style = {styles.container}>
            <TouchableHighlight
                style={[styles.btnDefaultStyle,this.props.btnStyle,styles.center]}
                activeOpacity={0.5}
                underlayColor={this.props.underlayColor}
                onPress={this.props.onPress}>

                <Text style={[styles.textDefaultStyle, this.props.textStyle]}>{this.props.btnName}</Text>

            </TouchableHighlight>
        </View>

        );
  }
}

3. 宏定义字段

项目开发中经常会使用到当前设备的屏幕宽高, 或者自定义常使用的字段, 这时候统一定义成宏方便使用.

const {width, height} = Dimensions.get('window');
const SCREEN_WIDTH = width;

const PWRightWid = 100;

4. 定义绑定事件

在登录注册页面中, 我们经常需要获取到登录的用户名,密码,验证码,手机号等字段, 这时候在React Native中就需要定义对应的字段绑定后来获取.

    this._getUserName = this._getUserName.bind(this); //获取用户名
    this._getUserPW = this._getUserPW.bind(this); //获取密码
    this._onClickLogin = this._onClickLogin.bind(this); //登录
    this._getPhoneCode = this._getPhoneCode.bind(this); //获取验证码
    this._onClickSIM = this._onClickSIM.bind(this); //点击切换账号手机号登录
    this._onClickForgetPW = this._onClickForgetPW.bind(this); //点击忘记密码
    this._hiddenGetCodeBtn = this._hiddenGetCodeBtn.bind(this); //隐藏获取验证码

5. 码UI点击事件处理

页面肯定需要码UI, 代码比较简单, 只是控件使用和布局, 这里就不过多讲, 这里详细介绍下对应的点击事件处理, 每个按钮的 onPress 和输入框的 onChangeText中都要进行处理, 来获取对应的值和逻辑处理.

(1). 首先需要在控件中定义点击事件和协议

TextInput输入框控件, 可以使用onChangeText 来获取输入的内容:

<TextInput style={styles.inputViewStyle}
                       onChangeText = {(text) => {
                          this.setState({userName: text});
                     }}
                      placeholder="请输入手机号"
                  />

Button按钮, 可以使用 onPress 来处理点击事件:

 <ButtonView 
        btnName='获取验证码'
        btnStyle = {{width: 90,marginRight: 10, backgroundColor: '#D6D6D6'}}
                      onPress = {this._getPhoneCode}
        textStyle = {{color:'gray', justifyContent: 'flex-end',}}
  ></ButtonView>
(2). 处理事件

TextInput使用onChangeText,获取对应输入的值:

  _getUserName = () => {
    alert('A name was submitted: ' + this.state.userName);
  };

Button使用onPress响应点击事件:

  _onClickLogin = () => {
    var usrInfo = "用户名:" + this.state.userName + "密码:" + this.state.userPW
    Alert.alert(usrInfo);

  };

6. 网络请求

本项目是基于登录来介绍, 在获取到对应的用户名密码或手机号验证码后, 需要请求接口传给后台来进行验证登录, 这里给大家介绍下fetch网络请求, 使用方便,简单易懂, 大家新手可以先使用这个, 后续介绍其它的方法.

 getUsrInfo = () => {

      fetch('http://...')
      .then((response) => response.json())
      .then((responseJson) => {

          this.state.userName = responseJson.status.code;
          this.state.userPW = responseJson.status.msg;

          this.setState({'userName':responseJson.status.code, 'userPW':responseJson.status.msg});
          
          return "responseJson.movies";
      })
      .catch((error) => {
          console.error(error);
      });
  }

7. 注册

因为登录页面需要使用到注册, 所以需要使用导航控制器来进行跳转, 这个上篇文章已经详细介绍过, 这里使用了RootView和自定义的RegistView.

export default createStackNavigator({
  Home: {
    screen: RootView
  },
  Details:{
    screen: RegistView
  },
});

正常的注册页面和登录其实逻辑相似, 所以在项目中我就想再介绍一个知识, 就是在注册页面中, 为大家介绍下FlatList使用自定义cell的情况.

(1)创建RegistCell

//创建RegistCell
export default class RegistCell extends React.Component {

    constructor(props) {
    super(props);
  }

  render() {

    // const {name, full_name} = this.props.item.item || {};
    let name = this.props.item.item.name;
    let full_name = this.props.item.item.owner.node_id;

    console.log(`===>message cell props, ${name}, ${full_name}`, this.props.item.item)

    return (
      <View style={styles.container}>
        <TouchableOpacity
          onPress={() => console.log('item clicked')}
          style={styles.touchable}>
          <View style={styles.touchableInside}>
            <Image
              source={require('./img/graphql_wx.jpg')}
              style={styles.image}
              resizeMode={Image.resizeMode.stretch} />
            <View style={styles.insideView}>
              <Text style={styles.insideText}>{name}</Text>
              <Text style={styles.insideText}>{full_name}</Text>
            </View>
          </View>
        </TouchableOpacity>
      </View>
    );
  }
}

(2)创建完cell后, renderItem注册cell.

renderItem = (item) => (
    <RegistCell item={item} />
  )

(3)创建FlatList,调用自定义RegistCell

 render() {

    return (

      <View style={styles.container}>
        <Text>Message</Text>
        <FlatList
          data={this.state.data || []}
          renderItem={this.renderItem}
          keyExtractor={item => item.id}
          // onRefresh={this.handleRefresh}
          onEndReachedThreshold={0} />
      </View>
    );
  }

简单的三步即可实现使用FlatList并自定义cell.

到这里, 基于 React Navigation 的登录注册页面的所有地方就完成了, 想看详细代码和运行效果的可到GitHub下载代码: https://github.com/YTiOSer/YTReact-Native_LoginUI, 里面有完整的代码.

您的支持是我的动力, 如果对您有所帮助的话, 不妨给个喜欢和关注哈!

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,743评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,296评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,285评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,485评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,581评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,821评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,960评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,719评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,186评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,516评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,650评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,329评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,936评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,757评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,991评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,370评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,527评论 2 349

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,777评论 25 707
  • 1、通过CocoaPods安装项目名称项目信息 AFNetworking网络请求组件 FMDB本地数据库组件 SD...
    阳明先生_X自主阅读 15,969评论 3 119
  • 很久没写过日记了,以前也有写日记的习惯,后来,懒了,也就慢慢不写了。曾是写在日记本上,现在想换个方式来写——毕竟人...
    just_To_Do阅读 135评论 0 0
  • 5月21日--5月27日是5.0践行的第十周。以下是本周的践行总结: 1、学习方面:本周学习正常。 《学习之道》已...
    武夷清风阅读 160评论 0 0
  • 当你在穿山越岭的另一边 我在孤独的路上没有尽头 时常感觉你在耳后的呼吸 却未曾感觉你在心口的鼻息 ————《思念是...
    藜九阅读 951评论 8 9