ReactNative学习笔记-仿今日头条登录页面并添加用户交互行为

ReactNative学习笔记-仿今日头条登录页面2

在上一篇文章中,主要介绍了在ReactNative中的一些常用基础控件,并且使用flexbox布局对今日头条的登陆页面进行了仿制。但上次完成的仿制页面不具备任何的可操作性,所以本节内容将在原有页面的基础上进行扩展,使其具备一定的可操作性。

在仿制过程中将会主要用到组件有:导航组件可触摸组件TextInput组件

导航组件

在开发中,我们需要实现多个界面的切换,这时候就需要一个导航控制器来进行各种效果的切换。那么,在ReactNative中有两个组件能够实现这样的效果:NavigatorNavigatorIOS

其中Navigator是适配Android和iOS,而NavigatorIOS则是包装了UIKit的导航功能,可以使用左划功能来返回到上一界面。

在本实例中将主要采用NavigatorIOS来进行后续的开发工作,所以下面将简单的概括下NavigatorIOS中的常用属性:

barTintColor string
导航条的背景颜色。

initialRoute{}
NavigatorIOS使用"路由"对象来包含要渲染的子视图、它们的属性、以及导航条配置。"push"和任何其它的导航函数的参数都是这样的路由对象。

参考实例:

initialRoute {
    component: function,   // 路由到对应的版块  
    title: string,   // 标题  
    passProps: object,   // 传递的参数
    backButtonIcon: Image.propTypes.source,  // 返回按钮
    backButtonTitle: string,  // 返回按钮标题
    leftButtonIcon:Image.propTypes.source,  //左侧图标
    leftButtonTitle: string, //左侧按钮标题
    onLeftButtonPress: function, //左侧按钮点击事件
    rightButtonIcon: Image.propTypes.source, //右侧按钮图标
    rightButtonTitle: string, //    右侧按钮标题
    onRightButtonPress: function,// 右侧按钮点击事件
    wrapperStyle: [object Object]
} 

itemWrapperStyle View#style
导航器中的组件的默认属性。一个常见的用途是设置所有页面的背景颜色。

navigationBarHidden bool
一个布尔值,决定导航栏是否隐藏。

shadowHidden bool
一个布尔值,决定是否要隐藏1像素的阴影。

tintColor string
导航栏上按钮的颜色。

titleTextColor string
导航器标题的文字颜色。

translucent bool
一个布尔值,决定是否导航条是半透明的。

可触摸组件

在ReactNative中可触摸组件共有四种:分别为TouchableOpacity,TouchableNativeFeedback,TouchableWithoutFeedback,TouchableHighlight。在本次开发中我们主要使用的为TouchableOpacity

TouchableOpacity

TouchableOpacity在用户触摸时提供了视觉效果,该组件在触摸发生时会变成半透明的组建,也就是说被这个组件遮盖的背景颜色、图案将会透过它被显示出来。

实例:

    <TouchableOpacity onPress={()=>this.loginByPhone()} 
                       activeOpacity={0.5} >
                    <View style={styles.loginByPhoneBtnContianer}>
                        <Text style={styles.loginByPhoneBtnTitle} >手机号登录</Text>
                    </View>
    </TouchableOpacity>

其中,activeOpacity定义了透明度的取值范围(0~1),0表示完全透明,1表示不透明。

TextInput组件

该组件相当于OC中的UITextField,在用法和属性方面,两者都有很大的相似之处。该组件可以使用View组件和Text组件的所有样式键,并且没有自己特殊的样式键。

请注意关于TextInput组件内部的元素不在使用flexbox布局,而是采用的文本布局!
由于TextInput中的属性较多,我们将在下面的开发按钮中,对常用属性进行简单的总结。

仿制开始

重构index.ios.js

在当前操作中我们将引入导航组件

  • 代码
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}}
            />
        );
    }
});

  • 结果展示
加入导航组件

其中component键用于设置需要路由的模块,title键用于设置当前导航栏的标题

重构TouTiaoLoginView.js并加入点击事件

当前重构主要是针对,手机号登录按钮添加了点击事件,并在点击事件中进行了页面导航

  • 代码
    {/**手机号登录*/}
    <TouchableOpacity onPress={()=>this.loginByPhone()}>
        <View style={styles.loginByPhoneBtnContianer}>
            <Text style={styles.loginByPhoneBtnTitle} >手机号登录</Text>
        </View>
    </TouchableOpacity>

    /**
     * 使用手机号进行登录
     */
    loginByPhone :function () {
        //console.log('使用手机号登录');
        this.props.navigator.push(
            {
                component: LoginByPhoneViewController,
                title: '手机号登录',
            }
        );
    }

在回调方法loginByPhone中,我们使用了方法push(route)将当前页面导航切换到一个新的页面中(LoginByPhoneViewController)

手机号登陆页面的绘制

手机号输入框的绘制

  • 代码
                <View style={styles.container}>
                    {/** 输入框容器 */}
                    <View style={styles.textInputContianer}>
                        {/** 手机号输入框 */}
                        <TextInput placeholder='手机号'
                                   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
    },
    //输入框样式:手机号
    textInputStylePhoneNum: {
        width: screenWidth * 0.9,
        height: 45,
        paddingLeft: 10,
        paddingRight: 10
    },
  • 显示结果
手机号输入框的绘制

在TextInput组件中,keyboardType键用于设置软键盘的类型,multiline键用于设置是否支持多行输入,clearButtonMode键用于设置清除按钮的出现模式,ref键则相当于相当于用于获取该组件的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
    },
  • 显示结果
密码输入框的绘制

在TextInput组件中,secureTextEntry键用于设置显示类型为密码,placeholderTextColor键用于设置提示文字的颜色

为输入框绑定监听事件

当前操作为监听号码输入框的输入信息,当输入字符长度大于1时,启用‘登录’按钮,当输入字符为空时,禁用‘登录’按钮。

  • 代码
<TextInput placeholder='手机号'
           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'}
            }
        },

        /**
         * 号码输入变化监听
         */
        phoneNumTextWatch(text){

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

其中getInitialState()方法为生命周期方法,我们在该方法中初始化了2个局部变量:loginBtnBgloginBtnTitleColor;

在函数phoneNumTextWatch(text)中,我们通过this.setState({})方法来修改变量loginBtnBgloginBtnTitleColor从而达到更新页面显示效果的目的。

更多的关于生命周期,状态机思维与变量的解说,我们将在下次进行具体说明。

感谢您的阅读,如果喜欢或者有所帮助就请给个赞吧😆😆

项目下载地址:https://github.com/wleics/ReactNative-Demo

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

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,953评论 25 707
  • 0.27 正式版发布 不兼容的修改 移除 NavigationLegacyNavigator (ef44781) ...
    被代码耽误的机车手阅读 1,665评论 1 4
  • 刚刚看完宫部雪美的火车,小心脏有点受不了了,听到阳台的一点点动静都大惊小怪
    木木君爱学习阅读 56评论 0 0
  • 文/刘河秀 写这篇感想的时候,窗外飘起了雪花,回头不经意看见了飘窗上那盆枯萎的迷迭香,就想到了它的花语。 看完《挪...
    刘河秀阅读 508评论 2 3
  • 我喜欢每日一起床就能看到绿色的植物,所以我养了好多花草,虽然这也花费了我很多的精力,但是我觉得值得。 如果你不喜欢...
    悠然小虾阅读 1,176评论 0 8