ReactNative學(xué)習(xí)筆記-仿今日頭條登錄頁面并添加用戶交互行為

ReactNative學(xué)習(xí)筆記-仿今日頭條登錄頁面2

在上一篇文章中穆壕,主要介紹了在ReactNative中的一些常用基礎(chǔ)控件铝噩,并且使用flexbox布局對(duì)今日頭條的登陸頁面進(jìn)行了仿制。但上次完成的仿制頁面不具備任何的可操作性蝇刀,所以本節(jié)內(nèi)容將在原有頁面的基礎(chǔ)上進(jìn)行擴(kuò)展树枫,使其具備一定的可操作性直焙。

在仿制過程中將會(huì)主要用到組件有:導(dǎo)航組件可觸摸組件砂轻、TextInput組件

導(dǎo)航組件

在開發(fā)中奔誓,我們需要實(shí)現(xiàn)多個(gè)界面的切換,這時(shí)候就需要一個(gè)導(dǎo)航控制器來進(jìn)行各種效果的切換搔涝。那么厨喂,在ReactNative中有兩個(gè)組件能夠?qū)崿F(xiàn)這樣的效果:NavigatorNavigatorIOS

其中Navigator是適配Android和iOS庄呈,而NavigatorIOS則是包裝了UIKit的導(dǎo)航功能蜕煌,可以使用左劃功能來返回到上一界面。

在本實(shí)例中將主要采用NavigatorIOS來進(jìn)行后續(xù)的開發(fā)工作,所以下面將簡單的概括下NavigatorIOS中的常用屬性:

barTintColor string
導(dǎo)航條的背景顏色诬留。

initialRoute{}
NavigatorIOS使用"路由"對(duì)象來包含要渲染的子視圖斜纪、它們的屬性、以及導(dǎo)航條配置文兑。"push"和任何其它的導(dǎo)航函數(shù)的參數(shù)都是這樣的路由對(duì)象盒刚。

參考實(shí)例:

initialRoute {
    component: function,   // 路由到對(duì)應(yīng)的版塊  
    title: string,   // 標(biāo)題  
    passProps: object,   // 傳遞的參數(shù)
    backButtonIcon: Image.propTypes.source,  // 返回按鈕
    backButtonTitle: string,  // 返回按鈕標(biāo)題
    leftButtonIcon:Image.propTypes.source,  //左側(cè)圖標(biāo)
    leftButtonTitle: string, //左側(cè)按鈕標(biāo)題
    onLeftButtonPress: function, //左側(cè)按鈕點(diǎn)擊事件
    rightButtonIcon: Image.propTypes.source, //右側(cè)按鈕圖標(biāo)
    rightButtonTitle: string, //    右側(cè)按鈕標(biāo)題
    onRightButtonPress: function,// 右側(cè)按鈕點(diǎn)擊事件
    wrapperStyle: [object Object]
} 

itemWrapperStyle View#style
導(dǎo)航器中的組件的默認(rèn)屬性。一個(gè)常見的用途是設(shè)置所有頁面的背景顏色绿贞。

navigationBarHidden bool
一個(gè)布爾值因块,決定導(dǎo)航欄是否隱藏。

shadowHidden bool
一個(gè)布爾值樟蠕,決定是否要隱藏1像素的陰影贮聂。

tintColor string
導(dǎo)航欄上按鈕的顏色靠柑。

titleTextColor string
導(dǎo)航器標(biāo)題的文字顏色寨辩。

translucent bool
一個(gè)布爾值,決定是否導(dǎo)航條是半透明的歼冰。

可觸摸組件

在ReactNative中可觸摸組件共有四種:分別為TouchableOpacity,TouchableNativeFeedback,TouchableWithoutFeedback,TouchableHighlight靡狞。在本次開發(fā)中我們主要使用的為TouchableOpacity

TouchableOpacity

TouchableOpacity在用戶觸摸時(shí)提供了視覺效果隔嫡,該組件在觸摸發(fā)生時(shí)會(huì)變成半透明的組建甸怕,也就是說被這個(gè)組件遮蓋的背景顏色甘穿、圖案將會(huì)透過它被顯示出來。

實(shí)例:

    <TouchableOpacity onPress={()=>this.loginByPhone()} 
                       activeOpacity={0.5} >
                    <View style={styles.loginByPhoneBtnContianer}>
                        <Text style={styles.loginByPhoneBtnTitle} >手機(jī)號(hào)登錄</Text>
                    </View>
    </TouchableOpacity>

其中梢杭,activeOpacity定義了透明度的取值范圍(0~1),0表示完全透明温兼,1表示不透明。

TextInput組件

該組件相當(dāng)于OC中的UITextField武契,在用法和屬性方面募判,兩者都有很大的相似之處。該組件可以使用View組件和Text組件的所有樣式鍵咒唆,并且沒有自己特殊的樣式鍵届垫。

請(qǐng)注意關(guān)于TextInput組件內(nèi)部的元素不在使用flexbox布局,而是采用的文本布局全释!
由于TextInput中的屬性較多装处,我們將在下面的開發(fā)按鈕中,對(duì)常用屬性進(jìn)行簡單的總結(jié)浸船。

仿制開始

重構(gòu)index.ios.js

在當(dāng)前操作中我們將引入導(dǎo)航組件妄迁。

  • 代碼
import {
    AppRegistry,
    NavigatorIOS
} from 'react-native';

var LoginView = require('./TouTiaoLoginView');

var TouTiaoDemo =  React.createClass({
    render() {
        return (

            <NavigatorIOS
                ref='nav'
                initialRoute={{
                    component: LoginView,
                    title: '登錄',
                }}
                style={{flex: 1}}
            />
        );
    }
});

  • 結(jié)果展示
加入導(dǎo)航組件

其中component鍵用于設(shè)置需要路由的模塊,title鍵用于設(shè)置當(dāng)前導(dǎo)航欄的標(biāo)題

重構(gòu)TouTiaoLoginView.js并加入點(diǎn)擊事件

當(dāng)前重構(gòu)主要是針對(duì)糟袁,手機(jī)號(hào)登錄按鈕添加了點(diǎn)擊事件判族,并在點(diǎn)擊事件中進(jìn)行了頁面導(dǎo)航

  • 代碼
    {/**手機(jī)號(hào)登錄*/}
    <TouchableOpacity onPress={()=>this.loginByPhone()}>
        <View style={styles.loginByPhoneBtnContianer}>
            <Text style={styles.loginByPhoneBtnTitle} >手機(jī)號(hào)登錄</Text>
        </View>
    </TouchableOpacity>

    /**
     * 使用手機(jī)號(hào)進(jìn)行登錄
     */
    loginByPhone :function () {
        //console.log('使用手機(jī)號(hào)登錄');
        this.props.navigator.push(
            {
                component: LoginByPhoneViewController,
                title: '手機(jī)號(hào)登錄',
            }
        );
    }

在回調(diào)方法loginByPhone中,我們使用了方法push(route)將當(dāng)前頁面導(dǎo)航切換到一個(gè)新的頁面中(LoginByPhoneViewController)

手機(jī)號(hào)登陸頁面的繪制

手機(jī)號(hào)輸入框的繪制

  • 代碼
                <View style={styles.container}>
                    {/** 輸入框容器 */}
                    <View style={styles.textInputContianer}>
                        {/** 手機(jī)號(hào)輸入框 */}
                        <TextInput placeholder='手機(jī)號(hào)'
                                   style={styles.textInputStylePhoneNum}
                                   keyboardType='phone-pad'
                                   multiline={false}
                                   clearButtonMode='while-editing'
                                   placeholderTextColor={'#939393'}
                                   ref='phoneNum'
                                   onChangeText={(text) =>                                  this.phoneNumTextWatch(text)}
                        >

                        </TextInput>
                    </View>
                </View>
  • 樣式:
    //輸入框容器
    textInputContianer: {
        width: screenWidth * 0.9,
        height: 90,
        borderRadius: 20,
        borderColor: '#E8E8E8',
        marginTop: 90,
        borderWidth: 0.5
    },
    //輸入框樣式:手機(jī)號(hào)
    textInputStylePhoneNum: {
        width: screenWidth * 0.9,
        height: 45,
        paddingLeft: 10,
        paddingRight: 10
    },
  • 顯示結(jié)果
手機(jī)號(hào)輸入框的繪制

在TextInput組件中项戴,keyboardType鍵用于設(shè)置軟鍵盤的類型形帮,multiline鍵用于設(shè)置是否支持多行輸入,clearButtonMode鍵用于設(shè)置清除按鈕的出現(xiàn)模式周叮,ref鍵則相當(dāng)于相當(dāng)于用于獲取該組件的id

密碼輸入框的繪制

  • 代碼
                        {/** 分割線 */}
                        <View style={styles.dividingLine}>

                        </View>
                        <View style={{flexDirection:'row',alignItems:'center',justifyContent:'center'}}>
                            {/** 密碼輸入框 */}
                            <TextInput placeholder='密碼'
                                       style={styles.textInputStylePWD}
                                       secureTextEntry={true}
                                       multiline={false}
                                       clearButtonMode='while-editing'
                                       placeholderTextColor={'#939393'}
                                       ref='pwd'
                            >

                            </TextInput>
                            {/** 找回密碼前的豎線 */}
                            <View style={styles.verticalLine}>

                            </View>
                            {/** 找回密碼按鈕 */}
                            <Text style={styles.findPswBtn}>找回密碼</Text>
                        </View>
  • 樣式
    //輸入框樣式:密碼
    textInputStylePWD: {
        width: screenWidth * 0.9 - 80,
        height: 45,
        paddingLeft: 10,
        paddingRight: 10
    },
    //分割線
    dividingLine: {
        backgroundColor: '#E8E8E8',
        height: 0.5,
        width: screenWidth * 0.9
    },
    //豎線
    verticalLine: {
        backgroundColor: '#E8E8E8',
        height: 15,
        width: 0.5
    },
  • 顯示結(jié)果
密碼輸入框的繪制

在TextInput組件中辩撑,secureTextEntry鍵用于設(shè)置顯示類型為密碼,placeholderTextColor鍵用于設(shè)置提示文字的顏色

為輸入框綁定監(jiān)聽事件

當(dāng)前操作為監(jiān)聽號(hào)碼輸入框的輸入信息仿耽,當(dāng)輸入字符長度大于1時(shí)合冀,啟用‘登錄’按鈕,當(dāng)輸入字符為空時(shí)项贺,禁用‘登錄’按鈕君躺。

  • 代碼
<TextInput placeholder='手機(jī)號(hào)'
           style={styles.textInputStylePhoneNum}
           keyboardType='phone-pad'
           multiline={false}
           clearButtonMode='while-editing'
           placeholderTextColor={'#939393'}
           ref='phoneNum'
           onChangeText={(text) => this.phoneNumTextWatch(text)}
           >
</TextInput>

        getInitialState(){
            return {
                loginBtnBg: {backgroundColor: '#959595'},
                loginBtnTitleColor: {color: '#757575'}
            }
        },

        /**
         * 號(hào)碼輸入變化監(jiān)聽
         */
        phoneNumTextWatch(text){

            if (text.length > 0) {
                this.setState({
                    loginBtnBg: {backgroundColor: '#F85959'},
                    loginBtnTitleColor: {color: '#ffffff'}
                });
            } else {
                this.setState({
                    loginBtnBg: {backgroundColor: '#959595'},
                    loginBtnTitleColor: {color: '#757575'}
                });
            }
        },

其中g(shù)etInitialState()方法為生命周期方法,我們?cè)谠摲椒ㄖ谐跏蓟?個(gè)局部變量:loginBtnBg开缎、loginBtnTitleColor;

在函數(shù)phoneNumTextWatch(text)中棕叫,我們通過this.setState({})方法來修改變量loginBtnBgloginBtnTitleColor從而達(dá)到更新頁面顯示效果的目的奕删。

更多的關(guān)于生命周期,狀態(tài)機(jī)思維與變量的解說俺泣,我們將在下次進(jìn)行具體說明。

感謝您的閱讀,如果喜歡或者有所幫助就請(qǐng)給個(gè)贊吧????

項(xiàng)目下載地址:https://github.com/wleics/ReactNative-Demo

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末伏钠,一起剝皮案震驚了整個(gè)濱河市横漏,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌熟掂,老刑警劉巖缎浇,帶你破解...
    沈念sama閱讀 211,265評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異赴肚,居然都是意外死亡华畏,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門尊蚁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來亡笑,“玉大人,你說我怎么就攤上這事横朋÷匚冢” “怎么了?”我有些...
    開封第一講書人閱讀 156,852評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵琴锭,是天一觀的道長晰甚。 經(jīng)常有香客問我,道長决帖,這世上最難降的妖魔是什么厕九? 我笑而不...
    開封第一講書人閱讀 56,408評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮地回,結(jié)果婚禮上扁远,老公的妹妹穿的比我還像新娘。我一直安慰自己刻像,他們只是感情好畅买,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評(píng)論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著细睡,像睡著了一般谷羞。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上溜徙,一...
    開封第一講書人閱讀 49,772評(píng)論 1 290
  • 那天湃缎,我揣著相機(jī)與錄音,去河邊找鬼蠢壹。 笑死嗓违,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的知残。 我是一名探鬼主播靠瞎,決...
    沈念sama閱讀 38,921評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼求妹!你這毒婦竟也來了乏盐?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,688評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤制恍,失蹤者是張志新(化名)和其女友劉穎父能,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體净神,經(jīng)...
    沈念sama閱讀 44,130評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡何吝,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了鹃唯。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片爱榕。...
    茶點(diǎn)故事閱讀 38,617評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖坡慌,靈堂內(nèi)的尸體忽然破棺而出黔酥,到底是詐尸還是另有隱情,我是刑警寧澤洪橘,帶...
    沈念sama閱讀 34,276評(píng)論 4 329
  • 正文 年R本政府宣布跪者,位于F島的核電站,受9級(jí)特大地震影響熄求,放射性物質(zhì)發(fā)生泄漏渣玲。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評(píng)論 3 312
  • 文/蒙蒙 一弟晚、第九天 我趴在偏房一處隱蔽的房頂上張望忘衍。 院中可真熱鬧,春花似錦卿城、人聲如沸淑履。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽秘噪。三九已至,卻和暖如春勉耀,著一層夾襖步出監(jiān)牢的瞬間指煎,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評(píng)論 1 265
  • 我被黑心中介騙來泰國打工便斥, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留至壤,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,315評(píng)論 2 360
  • 正文 我出身青樓枢纠,卻偏偏與公主長得像像街,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,749評(píng)論 25 707
  • 0.27 正式版發(fā)布 不兼容的修改 移除 NavigationLegacyNavigator (ef44781) ...
    被代碼耽誤的機(jī)車手閱讀 1,663評(píng)論 1 4
  • 剛剛看完宮部雪美的火車镰绎,小心臟有點(diǎn)受不了了脓斩,聽到陽臺(tái)的一點(diǎn)點(diǎn)動(dòng)靜都大驚小怪
    木木君愛學(xué)習(xí)閱讀 55評(píng)論 0 0
  • 文/劉河秀 寫這篇感想的時(shí)候,窗外飄起了雪花畴栖,回頭不經(jīng)意看見了飄窗上那盆枯萎的迷迭香随静,就想到了它的花語。 看完《挪...
    劉河秀閱讀 506評(píng)論 2 3
  • 我喜歡每日一起床就能看到綠色的植物吗讶,所以我養(yǎng)了好多花草燎猛,雖然這也花費(fèi)了我很多的精力,但是我覺得值得照皆。 如果你不喜歡...
    悠然小蝦閱讀 1,173評(píng)論 0 8