React-Native 二祈惶、登錄注冊模塊開發(fā)

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. 宏定義字段

項目開發(fā)中經常會使用到當前設備的屏幕寬高, 或者自定義常使用的字段, 這時候統(tǒng)一定義成宏方便使用.

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網絡請求, 使用方便,簡單易懂, 大家新手可以先使用這個, 后續(xù)介紹其它的方法.

 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)創(chuàng)建RegistCell

//創(chuàng)建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)創(chuàng)建完cell后, renderItem注冊cell.

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

(3)創(chuàng)建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閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件豌鸡,死亡現場離奇詭異,居然都是意外死亡轴总,警方通過查閱死者的電腦和手機直颅,發(fā)現死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來怀樟,“玉大人功偿,你說我怎么就攤上這事⊥ぃ” “怎么了械荷?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長虑灰。 經常有香客問我吨瞎,道長,這世上最難降的妖魔是什么穆咐? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任颤诀,我火速辦了婚禮,結果婚禮上对湃,老公的妹妹穿的比我還像新娘崖叫。我一直安慰自己,他們只是感情好拍柒,可當我...
    茶點故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布心傀。 她就那樣靜靜地躺著,像睡著了一般拆讯。 火紅的嫁衣襯著肌膚如雪脂男。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天种呐,我揣著相機與錄音宰翅,去河邊找鬼。 笑死陕贮,一個胖子當著我的面吹牛堕油,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼掉缺,長吁一口氣:“原來是場噩夢啊……” “哼卜录!你這毒婦竟也來了?” 一聲冷哼從身側響起眶明,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤艰毒,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后搜囱,有當地人在樹林里發(fā)現了一具尸體丑瞧,經...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年蜀肘,在試婚紗的時候發(fā)現自己被綠了绊汹。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,977評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡扮宠,死狀恐怖西乖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情坛增,我是刑警寧澤获雕,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布,位于F島的核電站收捣,受9級特大地震影響届案,放射性物質發(fā)生泄漏。R本人自食惡果不足惜罢艾,卻給世界環(huán)境...
    茶點故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一楣颠、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧咐蚯,春花似錦球碉、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽挎春。三九已至看疙,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間直奋,已是汗流浹背能庆。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留脚线,地道東北人搁胆。 一個月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親渠旁。 傳聞我的和親對象是個殘疾皇子攀例,可洞房花燭夜當晚...
    茶點故事閱讀 44,927評論 2 355

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,138評論 25 707
  • 1、通過CocoaPods安裝項目名稱項目信息 AFNetworking網絡請求組件 FMDB本地數據庫組件 SD...
    陽明先生_X自主閱讀 15,981評論 3 119
  • 很久沒寫過日記了顾腊,以前也有寫日記的習慣粤铭,后來,懶了杂靶,也就慢慢不寫了梆惯。曾是寫在日記本上,現在想換個方式來寫——畢竟人...
    just_To_Do閱讀 140評論 0 0
  • 5月21日--5月27日是5.0踐行的第十周吗垮。以下是本周的踐行總結: 1垛吗、學習方面:本周學習正常。 《學習之道》已...
    武夷清風閱讀 164評論 0 0
  • 當你在穿山越嶺的另一邊 我在孤獨的路上沒有盡頭 時常感覺你在耳后的呼吸 卻未曾感覺你在心口的鼻息 ————《思念是...
    藜九閱讀 959評論 8 9