React Native实现注册和登录

react-native-login:React Native项目实现了简单的登录 该项目是通过。 您将在下面找到有关执行常见任务的信息。 本指南的最新版本可。 目录 构建世博会的“独立”应用 从Create React Native App弹出 构建依赖关系(Xcode和Android Studio) 我应该使用ExpoKit吗? 故障排除 联网 iOS模拟器无法打开 QR码不扫描 更新到新版本 您只需要很少(理想情况下永远不需要)更新全局安装的create-react-native-app 。 更新应用程序的react-native-scripts依赖性应该很简单,只需增加package.json的版本号并重新安装项目的依赖性即可。 升级到React Native的新版本需要更新react-native , react和expo软件包版本,并在app.json设置正确的sdkVersion 。 有关软件包版本兼容性的最新信息,请参见版本控制指南。 可用脚 立即下载

React-Native-Register-Login-Demo

这是最终的效果图

项目演示

项目Demo可以到github上下载,方便大家理解。


下面将一步一步带大家完成这个Demo

搭建环境

环境的搭建只需要安装React Native中文网的步骤搭建环境即可,可以选择不同的桌面系统对不同的手机系统的环境的搭建。
这是使用的是最新的0.51版本,想要切换版本的可以点击左上角的版本来切换所需的版本
RN版本选择

程序开发

引入依赖

我们的Demo中使用了navigation,所以就需要引入依赖

首先,编辑package.json文件,在”dependencies”中添加”react-navigation”: “git+https://github.com/react-community/react-navigation.git“,这样就引入了依赖,添加后的”dependencies”如下所示

"dependencies": {
  "react": "16.2.0",
  "react-native": "0.52.0",
  "react-navigation": "git+https://github.com/react-community/react-navigation.git"
},

然后,我们就需要安装依赖了,使用命令行(mac的终端,windows的cmd)先进入项目根目录,然后执行npm install命令,然后运行一次项目,如果出错,就需要先将node_modules文件夹删除,然后重新执行一次npm install命令,这样就准备完成了

集中代码

个人习惯将js代码放到同一个文件夹下面,这样方便管理代码,所以我们需要先自己创建一个scene文件夹,然后将App.js文件夹移到scene文件夹中

如果使用的是WebStorm编辑的项目的话,我们移动App.js文件之后,它会自动修改index.js文件,便不用执行下一步了(以防万一,还是打开index.js查看是否正确)

当我们移动了App.js文件之后,运行项目可能出错,这是因为index.js文件中的程序入口指向的是App.js,而在上一步更改了App.js的路径,所以这里需要将路径更改正确

import { AppRegistry } from 'react-native';
import App from './scene/App';

AppRegistry.registerComponent('Demo', () => App);

这就是修改过后的index.js文件内容,注意第二行代码的impoot指向的是scene下的App.js文件

界面搭建

到这里,准备工作就都做完了,现在开始编写界面的文件,因为这个工程用了三个界面,所以我们再新建三个js文件,分别为loginScene.js、registerScene.js、homeScene.js,三个不同的js文件显示三个不同的界面,最后再用navigation来相互跳转即可(后话)

因为界面的搭建非常简单,所以直接贴代码,如果还有不清楚的,可以参考如下几个链接
《Flex 布局教程:语法篇》——阮一峰
《Flex 布局教程:实例篇》——阮一峰
《React-Native 的基本控件属性方法》——冬瓜小生

LoginScene.js

import React, { Component } from 'react';
import {
    TouchableOpacity,
    StyleSheet,
    TextInput,
    View,
    Text,
    Alert,
    Button
} from 'react-native';

export default class LoginScene extends Component {
    render() {
        return (
            <TouchableOpacity  //用可点击的组件作为背景
                activeOpacity={1.0}  //设置背景被点击时的透明度改变值
                style={styles.container}>
                <View
                    style={styles.inputBox}>
                    <TextInput
                        style={styles.input}
                        autoCapitalize='none'  //设置首字母不自动大写
                        underlineColorAndroid={'transparent'}  //将下划线颜色改为透明
                        placeholderTextColor={'#ccc'}  //设置占位符颜色
                        placeholder={'用户名'}  //设置占位符
                    />
                </View>
                <View
                    style={styles.inputBox}>
                    <TextInput
                        style={styles.input}
                        autoCapitalize='none'  //设置首字母不自动大写
                        underlineColorAndroid={'transparent'}  //将下划线颜色改为透明
                        secureTextEntry={true}  //设置为密码输入框
                        placeholderTextColor={'#ccc'}  //设置占位符颜色
                        placeholder={'密码'}  //设置占位符
                    />
                </View>
                <TouchableOpacity
                    style={styles.button}>
                    <Text
                        style={styles.btText}>登录</Text>  //设置按钮值
                </TouchableOpacity>
                <TouchableOpacity
                    style={styles.button}>
                    <Text
                        style={styles.btText}>注册</Text>  //设置按钮值
                </TouchableOpacity>
            </TouchableOpacity>
        );
    }
}

const styles = StyleSheet.create({
    container: {
        flex: 1,
        justifyContent: 'center',
        alignItems: 'center',
        backgroundColor: '#F5FCFF',
    },
    input: {
        width: 200,
        height: 40,
        fontSize: 20,
        color: '#fff',//输入框输入的文本为白色
    },
    inputBox: {
        flexDirection: 'row',
        justifyContent: 'center',
        alignItems: 'center',
        width: 280,
        height: 50,
        borderRadius: 8,
        backgroundColor: '#58812F',
        marginBottom: 8,
    },
    button: {
        height: 50,
        width: 280,
        justifyContent: 'center',
        alignItems: 'center',
        borderRadius: 8,
        backgroundColor: '#58812F',
        marginTop: 20,
    },
    btText: {
        color: '#fff',
        fontSize: 20,
    }
});

registerScene.js

import React, { Component } from 'react';
import {
    TouchableOpacity,
    StyleSheet,
    TextInput,
    View,
    Text,
    Alert
} from 'react-native';

export default class RegisterScene extends Component {
    render() {
        return (
            <TouchableOpacity
                activeOpacity={1.0}  //设置背景被点击时,透明度不变
                style={styles.container}>
                <View
                    style={styles.inputBox}>
                    <TextInput
                        style={styles.input}
                        autoCapitalize='none'  //设置首字母不自动大写
                        underlineColorAndroid={'transparent'}  //将下划线颜色改为透明
                        placeholderTextColor={'#ccc'}  //设置占位符颜色
                        placeholder={'用户名'}  //设置占位符
                    />
                </View>
                <View
                    style={styles.inputBox}>
                    <TextInput
                        style={styles.input}
                        secureTextEntry={true}  //设置为密码输入框
                        autoCapitalize='none'  //设置首字母不自动大写
                        underlineColorAndroid={'transparent'}  //将下划线颜色改为透明
                        placeholderTextColor={'#ccc'}  //设置占位符颜色
                        placeholder={'密码'}  //设置占位符
                    />
                </View>
                <View
                    style={styles.inputBox}>
                    <TextInput
                        style={styles.input}
                        secureTextEntry={true}  //设置为密码输入框
                        autoCapitalize='none'  //设置首字母不自动大写
                        underlineColorAndroid={'transparent'}  //将下划线颜色改为透明
                        placeholderTextColor={'#ccc'}  //设置占位符颜色
                        placeholder={'确认密码'}  //设置占位符
                    />
                </View>
                <TouchableOpacity
                    style={styles.button}>
                    <Text
                        style={styles.btText}>注册</Text>
                </TouchableOpacity>
            </TouchableOpacity>
        );
    }
}

const styles = StyleSheet.create({
    container: {
        flex: 1,
        justifyContent: 'center',
        alignItems: 'center',
        backgroundColor: '#F5FCFF',
    },
    input: {
        width: 200,
        height: 40,
        fontSize: 20,
        color: '#fff',//输入框输入的文本为白色
    },
    inputBox: {
        flexDirection: 'row',
        justifyContent: 'center',
        alignItems: 'center',
        width: 280,
        height: 50,
        borderRadius: 8,
        backgroundColor: '#66f',
        marginBottom: 8,
    },
    button: {
        height: 50,
        width: 280,
        justifyContent: 'center',
        alignItems: 'center',
        borderRadius: 8,
        backgroundColor: '#66f',
        marginTop: 20,
    },
    btText: {
        color: '#fff',
        fontSize: 20,
    }
});

homeScene.js

import React, { Component } from 'react';
import {
    Text,
    View,
    StyleSheet,
    Button
} from 'react-native';

export default class HomeScene extends Component {

    /**
     * 返回到登陆界面
     */
    backToLogin = () => {
    }

    render() {
        return (
            <View
                style={styles.container}>
                <Text
                    style={styles.content}
                >登录成功!这是主页!</Text>
                <Button
                    onPress={this.backToLogin}  //添加点击事件
                    style={styles.button}
                    title='点击返回登陆'/>  //设置按钮标题
            </View>
        );
    }

}

const styles = StyleSheet.create({
    container: {
        flex: 1,
        justifyContent: 'center',
        alignItems: 'center',
        backgroundColor: '#F5FCFF',
    },
    content: {
        fontSize: 40,
    },
});

到这里,三个界面就搭建完成了,想看看效果,可以修改index.js来查看,比如试试查看登陆界面的效果,index.js文件修改如下

import { AppRegistry } from 'react-native';
// import App from './scene/App';
import LoginScene from './scene/loginScene.js'

AppRegistry.registerComponent('Demo', () => LoginScene);

现在,三个界面的现实效果分别如下

登陆界面
注册页面
主页

添加事件

我们的界面已经搭建完成了,但是点击按钮没有任何反应。所以,现在来添加一些事件。

输入框值改变事件

首先,要添加的是输入框的事件,我们需要接收到输入框输入的值,然后才能进行相应的操作。输入框可以添加的事件很多,我们这里需要的是获取输入框中的值,所以恰当的选择有两个,第一个是onChangeText,第二个是onEndEditing。两个都可以获取到输入结束之后输入框中的值,但是onEndEditing获取值比较麻烦,所以这里就用第一个了。
但还要思考一个问题,我们获取到的值怎么使用呢?React Native中的InputText中的值不能直接获取,必须通过其事件才能获取,所以我们只能创建几个属性来保存获取到的值,然后再去使用它们。所以需要对相应的代码进行修改了,我们在对应的类中增加代码如下(class内部,render()方法之外)。

loginScene.js
username = '';  //保存用户名
password = '';  //保存密码

/**
 * 当用户名输入框值改变时,保存改变的值
 * @param  {[type]} newUsername [输入的用户名]
 */
onUsernameChanged = (newUsername) => {
    console.log(newUsername);//运行后可以在输入框随意输入内容并且查看log验证!
    this.username = newUsername;
};

/**
 * 当密码输入框值改变时,保存改变的值
 * @param  {[type]} newUsername [输入的密码]
 */
onPasswordChanged = (newPassword) => {
    console.log(newPassword);//运行后可以在输入框随意输入内容并且查看log验证!
    this.password = newPassword;
};

还需要给每个输入框绑定事件,就需要添加一行代码onChangeText={this.onUsernameChanged},例如,登陆界面中的用户名输入框的代码更改后的结果

<View
    style={styles.inputBox}>
    <TextInput
        onChangeText={this.onUsernameChanged}  //添加值改变事件
        style={styles.input}
        autoCapitalize='none'  //设置首字母不自动大写
        underlineColorAndroid={'transparent'}  //将下划线颜色改为透明
        placeholderTextColor={'#ccc'}  //设置占位符颜色
        placeholder={'用户名'}  //设置占位符
    />
</View>
registerScene.js
username = '';  //保存用户名
password = '';  //保存密码
confirmPassword = '';  //保存确认密码

/**
 * 当用户名输入框值改变时,保存改变的值
 * @param  {[type]} newUsername [输入的用户名]
 */
onUsernameChanged = (newUsername) => {
    console.log(newUsername);//运行后可以在输入框随意输入内容并且查看log验证!
    this.username = newUsername;
};

/**
 * 当密码输入框值改变时,保存改变的值
 * @param  {[type]} newUsername [输入的密码]
 */
onPasswordChanged = (newPassword) => {
    console.log(newPassword);//运行后可以在输入框随意输入内容并且查看log验证!
    this.password = newPassword;
};

/**
 * 当确认密码输入框值改变时,保存改变的值
 * @param  {[type]} newUsername [输入的确认密码]
 */
onConfirmPasswordChanged = (newConfirmPassword) => {
    console.log(newConfirmPassword);//运行后可以在输入框随意输入内容并且查看log验证!
    this.confirmPassword = newConfirmPassword;
}

相应的事件可自己绑定

这时,我们再运行程序,在输入框中输入一些值,便可以在控制台中看到相应的输出了。

按钮事件

输入框的事件绑定完成之后,我们就需要给按钮添加事件了
我们的按钮用的都是TouchableOpacity(首页用的Button),它们都有一个onPress事件可以使用,所以就非常方便了,添加的方式类似,话不多说,直接上代码

loginScene.js
/**
 * 登陆按钮,点击时验证输入的用户名和密码是否正确,正确时进入主页面,否则弹出提示
 */
login = () => {
    if (this.username == 'Admin' && this.password == '123') {
        Alert.alert("登陆成功");  //弹出提示框
    } else {
        Alert.alert("登陆失败","用户名或密码不正确");  //弹出提示框
    }
};

/**
 * 注册按钮,点击进入注册界面
 */
register = () => {
}

“登陆”按钮添加事件后的代码

<TouchableOpacity
    onPress={this.login} //添加点击事件
    style={styles.button}>
    <Text
        style={styles.btText}>登录</Text>
</TouchableOpacity>

registerScene.js

/**
 * 注册按钮,根据输入的内容判断注册是否成功
 */
register = () => {
    if (this.username != '' && this.password != '') {
        if (this.username != 'Admin') {
            if (this.password === this.confirmPassword) {
                Alert.alert("注册成功","返回登陆")
            } else {
                Alert.alert("注册失败","密码与确认密码不同");
            }
        } else {
            Alert.alert("注册失败","此用户名已经被注册");
        }
    } else {
        Alert.alert("注册失败","用户名或密码不能为空");
    }
};

到这里,事件差不多都添加完成了,但是,我们别忘了我们用的是什么做的背景。。。翻上去看代码的瞬间明白了,哦,原来是TouchableOpacity,那这个是用来干嘛的呢。这就是React Native中的一些问题了,我们的输入框输入结束之后,怎么取消它的焦点呢。前面测试的时候可能就有人遇到这个问题:当输入过数据之后,我们想重载界面(mac的command+r,windows的rr)失效了。所以,我们需要做一件事,就是点击空白处让输入框失去焦点。所以,我们需要给输入框添加一个属性ref,这样,我们就可以通过ref来获取输入框,再调用其blur方法,就可以让它们失去焦点了。代码添加如下

loginScene.js
/**
 * 点击空白处使输入框失去焦点
 */
blurTextInput = () => {
    this.refs.username.blur();
    this.refs.password.blur();
}

......

render() {
        return (
            <TouchableOpacity  //用可点击的组件作为背景
                activeOpacity={1.0}  //设置背景被点击时的透明度改变值
                onPress={this.blurTextInput}  //添加点击事件
                style={styles.container}>
                <View
                    style={styles.inputBox}>
                    <TextInput
                        ref="username"  //设置描述
                      ......
                    />
                </View>
                <View
                    style={styles.inputBox}>
                    <TextInput
                        ref="password"  //设置描述
                      ......
                    />
                </View>
                ......
            </TouchableOpacity>
        );
    }
registerScene.js
/**
 * 点击空白处使输入框失去焦点
 */
blurTextInput = () => {
    this.refs.username.blur();
    this.refs.password.blur();
    this.refs.confirmPassword.blur();
}

......

render() {
        return (
            <TouchableOpacity
                activeOpacity={1.0}  //设置背景被点击时,透明度不变
                onPress={this.blurTextInput}  //添加点击事件
                style={styles.container}>
                <View
                    style={styles.inputBox}>
                    <TextInput
                        ref="username"  //添加描述
                        ......
                    />
                </View>
                <View
                    style={styles.inputBox}>
                    <TextInput
                        ref="password"  //添加描述
                        ......
                    />
                </View>
                <View
                    style={styles.inputBox}>
                    <TextInput
                        ref="confirmPassword"  //添加描述
                        ......
                    />
                </View>
                ......
            </TouchableOpacity>
        );
    }

现在,大家就可以点击按钮试试效果了(注意:登陆页面只有输入用户名为Admin并且密码为123时才会提示登陆成功,注册页面当用户名输入为Admin时会提示该用户已注册)

界面跳转

到这里,就是最后一步了,连接三个界面并可以相互跳转,这里就要用到我们最开始导入的navigation依赖了.
使用navigation时,需要先注册你需要使用到的界面,所以我们就需要修改App.js文件了

App.js

/**
 * Sample React Native App
 * https://github.com/facebook/react-native
 * @flow
 */

import React from 'react';
import { StyleSheet, Text, View } from 'react-native';
import { StackNavigator } from 'react-navigation';

//引入三个界面文件,并设置引入的类
import HomeScene from './homeScene';
import LoginScene from './loginScene';
import RegisterScene from './registerScene';

//注册导航界面
const SimpleApp = StackNavigator({
    Login: {
      screen: LoginScene,
      navigationOptions: {  // 屏幕导航的默认选项, 也可以在组件内用 static navigationOptions 设置(会覆盖此处的设置)
          headerTitle: '登陆',  //设置导航栏标题
      }
    },
    Home: {
      screen: HomeScene,
      navigationOptions: {  // 屏幕导航的默认选项, 也可以在组件内用 static navigationOptions 设置(会覆盖此处的设置)
          header: null,  //隐藏导航栏
      }
    },
    Register: {
      screen: RegisterScene,
      navigationOptions: {  // 屏幕导航的默认选项, 也可以在组件内用 static navigationOptions 设置(会覆盖此处的设置)
          headerTitle: '注册',  //设置导航栏标题
      }
    }
});

export default class App extends React.Component {
    render() {
        return <SimpleApp />;
    }
}

当这些界面都添加到navigation中之后,就可以通过navigation来使用它们了,所以我们只需要修改相应的按钮的点击事件即可。

loginScene.js

/**
 * 登陆按钮,点击时验证输入的用户名和密码是否正确,正确时进入主页面,否则弹出提示
 */
login = () => {
    if (this.username == 'Admin' && this.password == '123') {
        this.refs.username.blur();
      this.refs.password.blur();
        const { navigate } = this.props.navigation;  //获取navigation的navigate方法
        navigate('Home');  //跳转到注册过的Home界面
    } else {
        Alert.alert("登陆失败","用户名或密码不正确");  //弹出提示框
    }
};

/**
 * 注册按钮,点击进入注册界面
 */
register = () => {
    const { navigate } = this.props.navigation;  //获取navigation的navigate方法
    navigate('Register');  //跳转到注册过的Register界面
}

register.js

/**
 * 注册按钮,根据输入的内容判断注册是否成功
 */
register = () => {
    if (this.username != '' && this.password != '') {
        if (this.username != 'Admin') {
            if (this.password === this.confirmPassword) {
                const { goBack } = this.props.navigation;  //获取navigation的goBack方法

                Alert.alert("注册成功","返回登陆",[{text: '确定', onPress: () => { goBack(); }}])  //给弹出的提示框添加事件
            } else {
                Alert.alert("注册失败","密码与确认密码不同");
            }
        } else {
            Alert.alert("注册失败","此用户名已经被注册");
        }
    } else {
        Alert.alert("注册失败","用户名或密码不能为空");
    }
};

homeScene.js

/**
 * 返回到登陆界面
 */
backToLogin = () => {
    const { goBack } = this.props.navigation; //获取navigation的goBack方法
    goBack();  //返回上一界面
}

到这里,就完成了整个Demo的所有实现,需要看完整代码的可以将Demo下载下来。
项目的github链接

项目发布

项目发布可以分别发布到iOS端和android端,在React Native中文网也有相应的教程,只不过发布到iOS平台还需要有付费的开发者账号,才能将App上架到App Store;而android端就不需要开发者账号了,只需要生成一个属于自己的签名即可。

发布的步骤可以参考如下:

iOS端
android端
由于React Native中文网中对iOS平台发布的描述很少,所以这里还有一篇教程可供大家参考
iOS端参考

最后,这个项目打包后的安卓apk如下
[apk下载链接](链接: https://pan.baidu.com/s/1i5Znq6p) 密码: i4zu

最后再贴下所有的代码吧。

index.js

import { AppRegistry } from 'react-native';
import App from './scene/App';

AppRegistry.registerComponent('Demo', () => App);

App.js

/**
 * Sample React Native App
 * https://github.com/facebook/react-native
 * @flow
 */

import React from 'react';
import { StyleSheet, Text, View } from 'react-native';
import { StackNavigator } from 'react-navigation';

//引入三个界面文件,并设置引入的类
import HomeScene from './homeScene';
import LoginScene from './loginScene';
import RegisterScene from './registerScene';

//注册导航界面
const SimpleApp = StackNavigator({
    Login: {
      screen: LoginScene,
      navigationOptions: {  // 屏幕导航的默认选项, 也可以在组件内用 static navigationOptions 设置(会覆盖此处的设置)
          headerTitle: '登陆',  //设置导航栏标题
      }
    },
    Home: {
      screen: HomeScene,
      navigationOptions: {  // 屏幕导航的默认选项, 也可以在组件内用 static navigationOptions 设置(会覆盖此处的设置)
          header: null,  //隐藏导航栏
      }
    },
    Register: {
      screen: RegisterScene,
      navigationOptions: {  // 屏幕导航的默认选项, 也可以在组件内用 static navigationOptions 设置(会覆盖此处的设置)
          headerTitle: '注册',  //设置导航栏标题
      }
    }
});

export default class App extends React.Component {
    render() {
        return <SimpleApp />;
    }
}

loginScene.js

import React, { Component } from 'react';
import {
    TouchableOpacity,
    StyleSheet,
    TextInput,
    View,
    Text,
    Alert,
    Button
} from 'react-native';

export default class LoginScene extends Component {

    username = '';  //保存用户名
    password = '';  //保存密码

    /**
     * 当用户名输入框值改变时,保存改变的值
     * @param  {[type]} newUsername [输入的用户名]
     */
    onUsernameChanged = (newUsername) => {
        console.log(newUsername);//运行后可以在输入框随意输入内容并且查看log验证!
        this.username = newUsername;
    };

    /**
     * 当密码输入框值改变时,保存改变的值
     * @param  {[type]} newUsername [输入的密码]
     */
    onPasswordChanged = (newPassword) => {
        console.log(newPassword);//运行后可以在输入框随意输入内容并且查看log验证!
        this.password = newPassword;
    };

    /**
     * 点击空白处使输入框失去焦点
     */
    blurTextInput = () => {
        this.refs.username.blur();
        this.refs.password.blur();
    }

    /**
     * 登陆按钮,点击时验证输入的用户名和密码是否正确,正确时进入主页面,否则弹出提示
     */
    login = () => {
        if (this.username == 'Admin' && this.password == '123') {
            this.refs.username.blur();
            this.refs.password.blur();
            const { navigate } = this.props.navigation;  //获取navigation的navigate方法
            navigate('Home');  //跳转到注册过的Home界面
        } else {
            Alert.alert("登陆失败","用户名或密码不正确");  //弹出提示框

        }
    };

    /**
     * 注册按钮,点击进入注册界面
     */
    register = () => {
        const { navigate } = this.props.navigation;  //获取navigation的navigate方法
        navigate('Register');  //跳转到注册过的Register界面
    }

    render() {
        return (
            <TouchableOpacity  //用可点击的组件作为背景
                activeOpacity={1.0}  //设置背景被点击时的透明度改变值
                onPress={this.blurTextInput}  //添加点击事件
                style={styles.container}>
                <View
                    style={styles.inputBox}>
                    <TextInput
                        ref="username"  //设置描述
                        onChangeText={this.onUsernameChanged}  //添加值改变事件
                        style={styles.input}
                        autoCapitalize='none'  //设置首字母不自动大写
                        underlineColorAndroid={'transparent'}  //将下划线颜色改为透明
                        placeholderTextColor={'#ccc'}  //设置占位符颜色
                        placeholder={'用户名'}  //设置占位符
                    />
                </View>
                <View
                    style={styles.inputBox}>
                    <TextInput
                        ref="password"  //设置描述
                        onChangeText={this.onPasswordChanged}  //添加值改变事件
                        style={styles.input}
                        autoCapitalize='none'  //设置首字母不自动大写
                        underlineColorAndroid={'transparent'}  //将下划线颜色改为透明
                        secureTextEntry={true}  //设置为密码输入框
                        placeholderTextColor={'#ccc'}  //设置占位符颜色
                        placeholder={'密码'}  //设置占位符
                    />
                </View>
                <TouchableOpacity
                    onPress={this.login} //添加点击事件
                    style={styles.button}>
                    <Text
                        style={styles.btText}>登录</Text>
                </TouchableOpacity>
                <TouchableOpacity
                    onPress={this.register}  //添加点击事件
                    style={styles.button}>
                    <Text
                        style={styles.btText}>注册</Text>
                </TouchableOpacity>
            </TouchableOpacity>
        );
    }
}

const styles = StyleSheet.create({
    container: {
        flex: 1,
        justifyContent: 'center',
        alignItems: 'center',
        backgroundColor: '#F5FCFF',
    },
    input: {
        width: 200,
        height: 40,
        fontSize: 20,
        color: '#fff',//输入框输入的文本为白色
    },
    inputBox: {
        flexDirection: 'row',
        justifyContent: 'center',
        alignItems: 'center',
        width: 280,
        height: 50,
        borderRadius: 8,
        backgroundColor: '#58812F',
        marginBottom: 8,
    },
    button: {
        height: 50,
        width: 280,
        justifyContent: 'center',
        alignItems: 'center',
        borderRadius: 8,
        backgroundColor: '#58812F',
        marginTop: 20,
    },
    btText: {
        color: '#fff',
        fontSize: 20,
    }
});

registerScene.js

import React, { Component } from 'react';
import {
    TouchableOpacity,
    StyleSheet,
    TextInput,
    View,
    Text,
    Alert
} from 'react-native';

export default class RegisterScene extends Component {

    username = '';  //保存用户名
    password = '';  //保存密码
    confirmPassword = '';  //保存确认密码

    /**
     * 当用户名输入框值改变时,保存改变的值
     * @param  {[type]} newUsername [输入的用户名]
     */
    onUsernameChanged = (newUsername) => {
        console.log(newUsername);//运行后可以在输入框随意输入内容并且查看log验证!
        this.username = newUsername;
    };

    /**
     * 当密码输入框值改变时,保存改变的值
     * @param  {[type]} newUsername [输入的密码]
     */
    onPasswordChanged = (newPassword) => {
        console.log(newPassword);//运行后可以在输入框随意输入内容并且查看log验证!
        this.password = newPassword;
    };

    /**
     * 当确认密码输入框值改变时,保存改变的值
     * @param  {[type]} newUsername [输入的确认密码]
     */
    onConfirmPasswordChanged = (newConfirmPassword) => {
        console.log(newConfirmPassword);//运行后可以在输入框随意输入内容并且查看log验证!
        this.confirmPassword = newConfirmPassword;
    }

    /**
     * 点击空白处使输入框失去焦点
     */
    blurTextInput = () => {
        this.refs.username.blur();
        this.refs.password.blur();
        this.refs.confirmPassword.blur();
    }

    /**
     * 注册按钮,根据输入的内容判断注册是否成功
     */
    register = () => {
        if (this.username != '' && this.password != '') {
            if (this.username != 'Admin') {
                if (this.password === this.confirmPassword) {
                    const { goBack } = this.props.navigation;  //获取navigation的goBack方法

                    Alert.alert("注册成功","返回登陆",[{text: '确定', onPress: () => { goBack(); }}])  //给弹出的提示框添加事件
                } else {
                    Alert.alert("注册失败","密码与确认密码不同");
                }
            } else {
                Alert.alert("注册失败","此用户名已经被注册");
            }
        } else {
            Alert.alert("注册失败","用户名或密码不能为空");
        }
    };

    render() {
        return (
            <TouchableOpacity
                activeOpacity={1.0}  //设置背景被点击时,透明度不变
                onPress={this.blurTextInput}  //添加点击事件
                style={styles.container}>
                <View
                    style={styles.inputBox}>
                    <TextInput
                        ref="username"  //添加描述
                        onChangeText={this.onUsernameChanged}  //添加值改变事件
                        style={styles.input}
                        autoCapitalize='none'  //设置首字母不自动大写
                        underlineColorAndroid={'transparent'}  //将下划线颜色改为透明
                        placeholderTextColor={'#ccc'}  //设置占位符颜色
                        placeholder={'用户名'}  //设置占位符
                    />
                </View>
                <View
                    style={styles.inputBox}>
                    <TextInput
                        ref="password"  //添加描述
                        onChangeText={this.onPasswordChanged}  //添加值改变事件
                        style={styles.input}
                        secureTextEntry={true}  //设置为密码输入框
                        autoCapitalize='none'  //设置首字母不自动大写
                        underlineColorAndroid={'transparent'}  //将下划线颜色改为透明
                        placeholderTextColor={'#ccc'}  //设置占位符颜色
                        placeholder={'密码'}  //设置占位符
                    />
                </View>
                <View
                    style={styles.inputBox}>
                    <TextInput
                        ref="confirmPassword"  //添加描述
                        onChangeText={this.onConfirmPasswordChanged}  //添加值改变事件
                        style={styles.input}
                        secureTextEntry={true}  //设置为密码输入框
                        autoCapitalize='none'  //设置首字母不自动大写
                        underlineColorAndroid={'transparent'}  //将下划线颜色改为透明
                        placeholderTextColor={'#ccc'}  //设置占位符颜色
                        placeholder={'确认密码'}  //设置占位符
                    />
                </View>
                <TouchableOpacity
                    onPress={this.register}  //添加点击事件
                    style={styles.button}>
                    <Text
                        style={styles.btText}>注册</Text>
                </TouchableOpacity>
            </TouchableOpacity>
        );
    }
}

const styles = StyleSheet.create({
    container: {
        flex: 1,
        justifyContent: 'center',
        alignItems: 'center',
        backgroundColor: '#F5FCFF',
    },
    input: {
        width: 200,
        height: 40,
        fontSize: 20,
        color: '#fff',//输入框输入的文本为白色
    },
    inputBox: {
        flexDirection: 'row',
        justifyContent: 'center',
        alignItems: 'center',
        width: 280,
        height: 50,
        borderRadius: 8,
        backgroundColor: '#66f',
        marginBottom: 8,
    },
    button: {
        height: 50,
        width: 280,
        justifyContent: 'center',
        alignItems: 'center',
        borderRadius: 8,
        backgroundColor: '#66f',
        marginTop: 20,
    },
    btText: {
        color: '#fff',
        fontSize: 20,
    }
});

homeScene.js

import React, { Component } from 'react';
import {
    Text,
    View,
    StyleSheet,
    Button
} from 'react-native';


export default class HomeScene extends Component {

    /**
     * 返回到登陆界面
     */
    backToLogin = () => {
        const { goBack } = this.props.navigation; //获取navigation的goBack方法
        goBack();  //返回上一界面
    }

    render() {
        return (
            <View
                style={styles.container}>
                <Text
                    style={styles.content}
                >登录成功!这是主页!</Text>
                <Button
                    onPress={this.backToLogin}  //添加点击事件
                    style={styles.button}
                    title='点击返回登陆'/>  //设置按钮标题
            </View>
        );
    }

}

const styles = StyleSheet.create({
    container: {
        flex: 1,
        justifyContent: 'center',
        alignItems: 'center',
        backgroundColor: '#F5FCFF',
    },
    content: {
        fontSize: 40,
    },
});
从原理到实践:详解RGBD相机深度与彩色图像对齐(D2C)算法 本文深入解析了RGBD相机深度与彩色图像对齐(D2C)算法的原理与实现。针对自组装相机中深度图与彩色图不匹配的核心痛点,文章从相机模型、坐标系变换等数学基础讲起,剖析了传统点映射算法的缺陷,并重点介绍了高效的矩形区域映射算法。该算法通过将深度像素视为矩形区域进行映射,有效解决了空洞和遮挡问题,并附有可直接复用的C++代码与优化技巧,为三维重建、机器人视觉等应用奠定坚实基础。 阅读详情

相关推荐

【深度学习】基于BERT模型的情感分析(附实战完整代码+数据集)

情感分类是一个快速发展的研究领域,尽管众多模型和数据集在二分类任务中显示出很高的准确性,但细粒度的情感分类任务仍然是一个很大改进空间的领域。分析SST-5数据集,Munikar等人的先前工作表明,嵌入工具BERT允许使用简单的模型来实现最新的准确性。

aaaa_hsjsueu的博客 2万+

react-native 阿里云一键登录

react-native 实现一键登录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 例如:第一章 Python 机器学习入门之pandas的使用 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录react-native 实现一键登录前言一、pandas是什么?二、使用步骤1.引入库2.读入数据总结学习目标:学习内容:学习时间:学习产出:前言一、pandas是什么?二、使用步骤1.引入库2.读入数据总结前言一、pandas是什么?二、使用步骤1.引入库2.读入

weixin_43947842的博客 3155

tuts4you-lena151-Crackme-tutorial06

一、前言      本次研究的是lena151-Crackme-tutorial06,也是一个应用程序,但因为平台迭代的关系,程序不能正常运行,只能完成部分破解。 (一)·本次我们要破解的目标是个应用程序,如下图 (二)、使用工具:x32dbg 二、过程 这个程序的破解的方法很多,首先最简单的一种不外乎就是搜索字符串,我就按照这个思路来完成。 (一)查找字符串&lt;Unregis...

h123120的专栏 518

react-native 完整实现登录功能

react native实现登录功能,包括ui的封装、网络请求的封装、导航器的实现、点击事件。demo下载:react-native 完整实现登录功能1.完整目录2.实现的界面3.主界面的代码实现import React, { Component } from 'react'; import { ToolbarAndroid, AppRegistry, StyleSheet, Tex

mangues 4万+

基于STM32避障/循迹/蓝牙遥控小车的硬件与软件底层设计

1、实现2m的自动直线行驶,要求左右偏移不大于10cm。2、车载显示屏显示车辆当前行驶速度或车辆运行时间,当前方20cm内出现障碍物时显示与前方障碍物的距离,车每次转弯蜂鸣器报警,同时通过左右指示灯指示转弯方向。3、依次驶过障碍物①②③④,且不触碰障碍物。4、成功进行调头转弯,行驶过程中车轮不碾压黑实线。5、在车道指定位置停车且不越界。6、通过红外、蓝牙、WiFi等任意一种方式实现对小车的控制,使其前进、后退、左转、右转。

2301_78758161的博客 1万+

详解Nacos集群搭建

在我们日常的开发当中,用的都是单点Nacos,这种模式,我们自己开发测试玩一玩还可以,但是到了企业的生产环境之下,你还这么玩的话,那肯定是要出大问题了。因为在企业当中,我们更加强调的是高可用,所以在企业的生产环境下,Nacos一定要做成个集群。

博客 1万+

用React Native实现APPID或微信用户登录

在 React Native 中实现 App ID 或微信用户登录可以使用第三方登录库来实现。 首先,你需要在 App ID 或微信开放平台上注册你的应用,然后获取到应用的 appId 和 appSecret。 然后,你可以使用 react-native-app-auth 库来实现 OAuth2.0 授权流程。这个库支持许多第三方登录平台,包括 App ID 和微信。 你可以使用以下步骤来实现登录...

weixin_35755434的博客 1387

PX4飞控CAN总线通信深度配置:从menuconfig到驱动加载的完整指南

本文详细解析了PX4飞控中CAN总线通信的深度配置流程,从menuconfig选项设置到驱动加载的完整指南。涵盖硬件抽象层、驱动层和应用层的配置细节,提供实际验证方法和故障排查技巧,帮助开发者高效实现CAN通信,特别适用于无人机和机器人底盘运动控制等场景。

weixin_30374009的博客 499

常见的React Native应用布局:登录页面

在本系列中,您将学习如何使用React Native创建移动应用程序中常用的页面布局。 您将要创建的布局将不起作用-相反,本系列的主要重点是让您动手以布局React Native应用程序中的内容。 为了跟随本系列的进行,在您阅读本教程中的分步说明之前,我建议您先尝试自己重新创建每个屏幕。 仅仅阅读本教程,您将不会真正从中受益! 首先尝试,然后再在此处查找答案。 如果成功使它看起来像原始屏幕...

代码教主 1182

Github多人协作

最近有门课程需要几个人一起开发一个项目,此前我们基本都是单干的,多人合作意味着需要及时将我们每个人的代码进行合并,U盘传文件这种方式太慢了,效率不行,而且没法解决两个人同时修改一个文件的问题,这次我们就尝试使用Github来协助开发。下面就来记录一下这次开发遇到的一些问题和解决的方法。 Git的安装 从官网下载最新版按照默认安装即可。 此处不多加说明。 Git常用命令 在此放上一...

yzr1216的博客 1万+

银河麒麟操作系统最佳实践专栏介绍

本专栏聚焦国产银河麒麟操作系统(桌面版/服务器版)的实战应用,提供系统安装、配置优化、应用部署、故障排查等实用指南。内容基于真实操作场景,涵盖Linux通用技术(如RAID配置、环境变量管理)、服务器系统专项(如数据库迁移、驱动安装、安全加固)及桌面系统技巧(如PXE安装、镜像封装)。面向IT运维、开发者和国产化转型人员,突出实战性和差异化,帮助用户规避常见问题,提升系统管理效率。所有教程均配有详细步骤和截图,确保可操作性,并持续更新适配新版系统。

信创运维工程师 · 银河麒麟 & 容器实战 | 金融生产环境迁移·等保加固 | 142篇原创·17万+阅读 531

React-native 登陆注册验证

import React, { Component } from “react”; import { StyleSheet, Text, View, Image, TouchableHighlight,Button,AsyncStorage } from “react-native”; import { createSwitchNavigator } from “react-navigation...

qq_43479946的博客 2657

超声波传感器(CH101&ch201) - Ⅰ

压电微机械超声换能器(PMUT)和超声波信号处理的可编程片上系统(SoC)集成在一起的传感器

nicole088的专栏 2796

React Native 实现登录注册二

接上文:记录一下其他页面。homescreen页面主要就是练习一下,创建文件还有布局,组件等。 import { Button, StyleSheet, View,Text, TextInput, SafeAreaView, Alert } from "react-native" import { color } from "react-native-reanimated" import React from 'react'; export default class HomeScreen exte.

weixin_37166398的博客 1266

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

React Native 实现登录注册 三

前面两篇文章,主要讲了在使用控件的时候,需要注意的一些问题。本文主要讲一下,页面之间的跳转。 因为我是刚开始搞react native 所以我采用的是React Navigation :此处是我的项目配置 "dependencies": { "@react-native-community/masked-view": "^0.1.10", "@react-navigation/bottom-tabs": "^5.11.8", "@react-navigation/d...

weixin_37166398的博客 884

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

React Native 在Windows 环境下,实现登录注册页面一

先上效果图: 这个项目主要就是初学 react native 用于熟悉这些组件。 主要实现的效果如上图所示:1.页面的跳转的三种类型 2.布局还有相关组件的熟悉 3.修改入口页面 1.关于入口文件的修改。一般情况下,默认的入口文件是app,js 如何修改,过程是这样的。 第一步,创建我们所需要的的入口文件。我创建的是welcome.js 到此为止,入口文件的设置已经完成。现在我按照自己的步骤来一个一个页面的记录。 首先就是创建文件的过程: import * as React f..

weixin_37166398的博客 470

基于React Native鸿蒙跨平台实现登录注册认证应用实现,完成表单处理、验证以及数据绑定

/ RN 自定义复选框</Text>}</View><Text style={styles.checkboxLabel}>记住我</Text>// 鸿蒙自定义复选框适配Button().width(18)}).child(Text('?')Text('记住我')

weixin_43393161的博客 762

由springboot2/react-native/spring-security/jwt实现登录注册功能的RN app源代(app前端后台完整源代码)

RN app源代码做了登录与注册的功能,集成了springboot2,react-native, spring-security,jwt -------- 源代码-------- 前端https://github.com/phelpsyacht/react-springboot2-app 后台https://github.com/phelpsyacht/springboot2-react-app-...

phelpsyacht的博客 1112

React Native登录注册页面实现空白处收起键盘

其实很简单,直接使用ScrollView作为父视图即可。有木有很神奇啊,以前都还不知道呢。。。。。

weixin_30602505的博客 313

HarmonyOS 6基于React Native鸿蒙跨平台实现登录注册认证应用实现,完成表单处理、验证以及数据绑定

/ RN 自定义复选框</Text>}</View><Text style={styles.checkboxLabel}>记住我</Text>// 鸿蒙自定义复选框适配Button().width(18)}).child(Text('?')Text('记住我')

czhm57的博客 235

React-Native 高仿“掘金”App 注册和登录界面

上一篇博客写了关于如何自定义一个输入框,所以打算拿一个app来练练手。看了一下感觉“掘金”客户端,感觉不错,里面包含了很多控件可以用react-native来实现。相信这个app做完,应该大部分app的界面都可以搞定了。今天介绍一下注册界面和登录界面。感觉这个界面实现起来还是不太难,用到了react-native-vector-icons来完成左上角的返回按钮,这个开源库后面在做Tabbar的图标

wangdi的游戏社区 5593

native react 集成微信登录_react native qq登录/微信登录实现(android端)

微信登录实现(react-native-wechat)开源库地址1.首先需要去微信开发平台去注册账号并且创建一个移动应用 链接 https://open.weixin.qq.com签名获取推荐使用签名工具获取2.Android版本安装配置方法,类似qq2.1.在android/settings.gradle文件中添加如下代码:include ':RCTWeChat'project(':RCTWeC...

weixin_39581652的博客 536

如何构建React Native应用并将其与Firebase集成

In this tutorial, we are going to build a React Native app that is integrated with a Firebase backend. The app will support both the React Native CLI as well as Expo CLI. 在本教程中,我们将构建一个与Firebase后端集成的R...

cumian8165的博客 1212

第08课:注册登录

这篇内容首先会教大家一个原生在启动 RN 的时候传参数的方法,该方法需要少量的更改原生代码即可,实现非常简单,接着会正式讲解怎么开发一个登录注册界面。 初始化参数传递 加入项目需要用到几个 App 一起上线,但是使用的是一套前端代码,这里就可以通过原生传入参数的方式改变前端的行为,这个方式使用到场景也不算少了,有需要的可以了解一下。 ``` javascrpt import { AppRegist...

疯狂紫萧 293

使用AWS Amplify为React Native App增压

您将要创造的 AWS Amplify是一个开源库,使开发人员(在我们的情况下为移动开发人员)可以向应用程序添加大量有价值的功能,包括分析,推送通知,存储和身份验证。 Amplify不仅可以与React Native一起使用,而且还可以与Vue,Angular,Ionic,React Web以及实际上任何JavaScript框架一起使用。 在本教程中,我们将在React Native应用程...

代码教主 997

React Native 全栈开发实战班 - 原生功能集成之第三方登录

用户选择使用 Google、Facebook 等第三方平台的账户进行登录。应用通过第三方平台的 SDK 或 API 发起身份验证请求。用户在第三方平台授权应用访问其账户信息。应用从第三方平台获取用户的身份信息(如用户 ID、姓名、邮箱等)。应用根据获取到的用户信息完成登录流程。常见的第三方登录平台:微信登录QQ 登录用于实现 Google 登录。用于实现 Facebook 登录。用于实现 Apple 登录。用于实现 Twitter 登录。用于实现微信登录。本章节将重点介绍如何使用和。

知道者 1806

React Native 全栈开发实战班 - 集成微信登录

前往微信开放平台注册账号,并创建一个应用。获取应用的App ID和App Secret。在微信开放平台的应用设置中,配置应用的包名(Android)和 Bundle Identifier(iOS)。配置(iOS)和URL Scheme(Android),用于处理微信登录回调。下载微信 SDK 并按照文档进行配置。本章节介绍了 React Native 中的微信登录功能,包括如何使用库来实现微信登录,以及服务器端如何处理微信登录流程。

知道者 2079
上一篇: (作业)采用多MVC和Core Data构造一个个人信息维护程序
下一篇: Swift中UIScrollView与自定义上下滑动手势冲突
麻豆_matou
博客等级 码龄10年 41粉丝 46原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值