ReactNative基础一编写一个登录页面

此博客基于react-native-0.48.4

React Native 一个跨平台开发的语言!一套代码可以同时跑在多个端,想想都刺激;下面就来用RN开发一个登录页面,熟悉语法和RN代码的编写(大神可以出门右拐)

来看下我们要实现的效果图:
  • React Native 中文网:http://reactnative.cn/docs/0.48/getting-started.html
  • 在这里你可以跟着教程搭建一个开发环境(目前最新版本为v0.48;2017年09月18)
  • 我是搭建的Android开发环境,当我尝试着安装到ios模拟器上时出现了一个错误这里给出解决方案
  • 开发工具当然是毫无疑问的选择我们JetBrains的WebStorm

先来简单介绍一下在RN中一个重要的布局方式Flexbox布局

Flexbox重要的的三个属性
● flexDirection:决定主轴的排列方式,默认值是竖直轴(column)方向;取值=[column、row]
● justifyContent:决定其子元素沿着主轴的排列方式;取值=[flex-start、center、flex-end、space-around、space-between]
● alignItems:决定其子元素沿着次轴(与主轴垂直的轴)排列方式;取值= [flex-start、center、flex-end、stretch](注意:要使stretch选项生效的话,子元素在次轴方向上不能有固定的尺寸)
使用Flexbox布局
● 说了这么多,还是来通过一张图来理解这三个属性

创建一个新项目,先来看下默认的index.android.js(也就是运行在Android设备上的主入口)里面的内容:

import React,{Component} from 'react';
import {//引入我们使用的到包
    AppRegistry,StyleSheet,Text,View
} from 'react-native';

export default class Test extends Component {
    render() {
        return (
            <View style={styles.container}>
                <Text style={styles.welcome}>
                    Welcome to React Native!
                </Text>
                <Text style={styles.instructions}>
                    To get started,edit index.android.js
                </Text>
                <Text style={styles.instructions}>
                    Double tap R on your keyboard to reload,{'\n'}
                    Shake or press menu button for dev menu
                </Text>
            </View>
        );
    }
}

//定义我们控件的样式
const styles = StyleSheet.create({
    container: {
        flex: 1,justifyContent: 'center',alignItems: 'center',backgroundColor: '#F5FCFF',},welcome: {
        fontSize: 20,textAlign: 'center',margin: 10,instructions: {
        textAlign: 'center',color: '#333333',marginBottom: 5,});
//注册我们的组件(只需要在 index.android.js、index.ios.js注册即可)这里用引号括起来的'Test'必须和你init创建的项目名一致
AppRegistry.registerComponent('Test',() => Test);

现在就可以在这个页面上进行自己的创作了,return()返回的就是我们的页面(在Android中可以称之为是一个布局)

  • 那就开始绘制我们的登录页吧,先来布局我们的头像:
return (
    //为我们的根视图设置一个样式
    <View style={styles.container}>
        {/*为头像设置一个样式,和图片资源*/}
        <Image style={styles.circleImage} source={require('./src/image/logo.png')}/>
    </View>
);

//一些属性的意思,直接看单词就可以知道了就不用一一解释了
const styles = StyleSheet.create({
    container: {
        flex: 1,//相当于android布局的weight 充满容器
        flexDirection: 'column',backgroundColor: '#dddddd',//设置次轴的对齐方式
        alignItems: 'center',circleImage: {
        width: 80,height: 80,borderRadius: 40,borderWidth: 2,borderColor: 'white',marginTop: 100,marginBottom: 25,}

< Image>标签通过source={require('./src/image/logo.png')require引入一个图片资源(使用的是相对路径).
项目的目录结构:

这样一个简单的圆形头像就出来了:运行的效果

上面View的样式是分开来定义的,当然我们也可以直接在View上接着写代码,格式如下:

<Image style={{
        width: 80,height: 80,borderRadius: 40,borderWidth: 2,borderColor: 'white',marginTop: 100,marginBottom: 25,}} source={require('./src/image/logo.png')}/>

如果我们要重新看程序的运行效果,只需要按两下R键或者 Ctrl/Command + M

#### 接下来就是绘制 账号和密码输入框了 > 我们的根View布局主轴的方向是(column)是垂直的,所以我们只需要在标签下继续添 文本输入框即可
{/*用户名*/}
<TextInput  style={styles.textInput} placeholder={'请输入用户名'} //输入框下划线 underlineColorAndroid={'transparent'}/>
{/*密码*/}
<TextInput  style={styles.textInput} placeholder={'请输入密码'} secureTextEntry={true} underlineColorAndroid={'transparent'}/>

样式也是一样继续在已有的后面追加

textInput: { height: 40,width: width,backgroundColor: 'white',},
  • 这里介绍一下使用到的属性
  • placeholder 设置输入提示内容(相当于Android EditText 的hint属性)
  • underlineColorAndroid 设置输入框的下划线的颜色(在Android系统中)
  • secureTextEntry 设置输入框 是否为安全框
  • 更多详细的属性看这里TextInput
  • 上面我们使用了一个width变量这个就是获取的屏幕的宽度,那么是怎么获取的呢?来看一下吧:Dimensions
//屏幕信息
var dimensions = require('Dimensions');
//获取屏幕的宽度和高度
var {width,height} = dimensions.get('window');

接下来就要绘制登录按钮来,Rn中有Button标签但是并不推荐使用这个;我们可以使用这个TouchableOpacity来代替Button,具体可以查看官方文档说明

{/*登录*/}
<TouchableOpacity style={styles.btnStyle}>
    <Text style={styles.loginText}>登录</Text>
</TouchableOpacity>
btnStyle: { height: 40,width: width - 32,borderRadius: 5,marginTop: 20,backgroundColor: '#4398ff',//沿主轴方向居中 justifyContent: 'center',loginText: { //指定文本的对齐方式 textAlign: 'center',color: 'white',//设置文本垂直方向居中 textAlignVertical: 'center',

这里就开始绘制登录按钮下面的 无法登录和新用户这两个文本了,分析:这两个文本是一水平方式排列的 而且分别左右对齐,所以我们需要在这两个文本外面嵌套View容器并指定主轴方向为row;同时还需要设置左右对齐那么只需要主轴的排列方式即可Flexbox

{/*无法登录 新用户*/} <View style={styles.canNot}> <Text style={{color: '#4398ff'}}>无法登录</Text> <Text style={{color: '#4398ff'}}>新用户</Text> </View>
canNot: { width: width - 32,marginTop: 15,flexDirection: 'row',//设置主轴为两端对齐 justifyContent: 'space-between',

来看下现在的效果:

现在就只剩下最后一部分了左下角的其他登录方式;这里就需要使用到绝对定位了,来看下代码吧

{/*其它登录方式*/}
<View style={styles.loginTheWay}>
    <Text>其它登录方式:</Text>
    <Image style={styles.image} source={require('./src/image/alipay.png')}/>
    <Image style={styles.image} source={require('./src/image/wechat.png')}/>
</View>
loginTheWay: { flexDirection: 'row',//设置次轴的对齐方式 alignItems: 'center',justifyContent: 'flex-start',//绝对定位 position: 'absolute',//距离底部还有30 距离左边还有10 这样的一个位置 bottom: 30,left: 10,image: { width: 50,height: 50,marginLeft: 5,borderRadius: 25,

写到这里就把这个登录页面给画完了,这里讲的都是页面布局所以不是很难,耐心理解下就会了。那么如果我们要同时运行在ios和Android设备上要怎么弄呢?其实也是很简单,需要在index.android.js,index.ios.js入口文件中引用同一个页面就可以了,下面就一起来看下吧。

同时支持ios和android设备运行

我们在项目的src目录下继续创建一个js的文件夹(要有一个良好的分包习惯)在js目录下创建一个LoginView.js文件这里就可以来写我们刚搭建的登陆界面,这样好让其他地方引用:

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

//屏幕信息
var dimensions = require('Dimensions');
//获取屏幕的宽度
var {width} = dimensions.get('window');

class LoginView extends Component {
    render() {
        return (
            <View style={styles.container}>
                {/*头像*/}
                <Image style={styles.circleImage} source={require('../image/logo.png')}/>
                 //省略若干代码...
                </View>
            </View>
        );
    }
}
//以下为样式代码
const styles = StyleSheet.create({
    container: {
        flex: 1,flexDirection: 'column',//省略若干代码...
});

//输出本类 记住一定是exports 不是 export
module.exports = LoginView;

重点是最后一行代码module.exports = LoginView输出本类,这样在其他地方就可以引用了

现在我们来修改index.android.js文件,ios的入口也是一样的只需要把代码拷贝过去即可

import React,{Component} from 'react';

import {
    AppRegistry,} from 'react-native';

//引入外部的js文件
var LoginView = require('./src/js/loginView');

class QQLoginPage extends Component {
    render() {
        return (
            //字母必须大写开头
            <LoginView/>
        );
    }
}

AppRegistry.registerComponent('QQLoginPage',() => QQLoginPage);

终极效果

源码在这里多啦A梦传送门

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


react 中的高阶组件主要是对于 hooks 之前的类组件来说的,如果组件之中有复用的代码,需要重新创建一个父类,父类中存储公共代码,返回子类,同时把公用属性...
我们上一节了解了组件的更新机制,但是只是停留在表层上,例如我们的 setState 函数式同步执行的,我们的事件处理直接绑定在了 dom 元素上,这些都跟 re...
我们上一节了解了 react 的虚拟 dom 的格式,如何把虚拟 dom 转为真实 dom 进行挂载。其实函数是组件和类组件也是在这个基础上包裹了一层,一个是调...
react 本身提供了克隆组件的方法,但是平时开发中可能很少使用,可能是不了解。我公司的项目就没有使用,但是在很多三方库中都有使用。本小节我们来学习下如果使用该...
mobx 是一个简单可扩展的状态管理库,中文官网链接。小编在接触 react 就一直使用 mobx 库,上手简单不复杂。
我们在平常的开发中不可避免的会有很多列表渲染逻辑,在 pc 端可以使用分页进行渲染数限制,在移动端可以使用下拉加载更多。但是对于大量的列表渲染,特别像有实时数据...
本小节开始前,我们先答复下一个同学的问题。上一小节发布后,有小伙伴后台来信问到:‘小编你只讲了类组件中怎么使用 ref,那在函数式组件中怎么使用呢?’。确实我们...
上一小节我们了解了固定高度的滚动列表实现,因为是固定高度所以容器总高度和每个元素的 size、offset 很容易得到,这种场景也适合我们常见的大部分场景,例如...
上一小节我们处理了 setState 的批量更新机制,但是我们有两个遗漏点,一个是源码中的 setState 可以传入函数,同时 setState 可以传入第二...
我们知道 react 进行页面渲染或者刷新的时候,会从根节点到子节点全部执行一遍,即使子组件中没有状态的改变,也会执行。这就造成了性能不必要的浪费。之前我们了解...
在平时工作中的某些场景下,你可能想在整个组件树中传递数据,但却不想手动地通过 props 属性在每一层传递属性,contextAPI 应用而生。
楼主最近入职新单位了,恰好新单位使用的技术栈是 react,因为之前一直进行的是 vue2/vue3 和小程序开发,对于这些技术栈实现机制也有一些了解,最少面试...
我们上一节了了解了函数式组件和类组件的处理方式,本质就是处理基于 babel 处理后的 type 类型,最后还是要处理虚拟 dom。本小节我们学习下组件的更新机...
前面几节我们学习了解了 react 的渲染机制和生命周期,本节我们正式进入基本面试必考的核心地带 -- diff 算法,了解如何优化和复用 dom 操作的,还有...
我们在之前已经学习过 react 生命周期,但是在 16 版本中 will 类的生命周期进行了废除,虽然依然可以用,但是需要加上 UNSAFE 开头,表示是不安...
上一小节我们学习了 react 中类组件的优化方式,对于 hooks 为主流的函数式编程,react 也提供了优化方式 memo 方法,本小节我们来了解下它的用...
开源不易,感谢你的支持,❤ star me if you like concent ^_^
hel-micro,模块联邦sdk化,免构建、热更新、工具链无关的微模块方案 ,欢迎关注与了解
本文主题围绕concent的setup和react的五把钩子来展开,既然提到了setup就离不开composition api这个关键词,准确的说setup是由...
ReactsetState的执行是异步还是同步官方文档是这么说的setState()doesnotalwaysimmediatelyupdatethecomponent.Itmaybatchordefertheupdateuntillater.Thismakesreadingthis.staterightaftercallingsetState()apotentialpitfall.Instead,usecom