react移动端登录(第三方登录)和个人执行实现

本文展示了如何使用React和AntdMobile库创建一个移动端登录页面,包括手机号验证码登录、第三方登录(如GitHub)以及登录验证功能。代码示例详细解释了组件的实现,包括输入验证、发送验证码的倒计时逻辑和登录接口调用。同时,还提供了用户中心页面的实现,展示登录后用户信息的显示及退出登录操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

react和antdMobile实现的移动端登录(第三方登录)和个人执行实现


效果展示 在这里插入图片描述

注意:发送的Ajax请求均为mock模拟生成,如需使用请在src/api/Ajax.js下统一修改请求链接。

部分代码展示:

login.jsx

import React, { Component } from 'react'
import { NavBar,Form, Input,Button,Toast} from 'antd-mobile'
import {reqVerifyCode,reqLogin} from '../../api/index'
import styles from './demo2.less'
import './index.less'
import github from './imgs/github-logo.png'
import wx from './imgs/wx.png'
import qq from './imgs/qq.png'
import {phoneReg,verifyCodeReg} from '../../utils/reg'

export default class Login extends Component {
  state={
    phone:'',
    verifyCode:'',
    time:10,
    canClick:true
  }
  // 保存数据
  savaDate=(type)=>{
    return (value)=>{
      // 如果用户输入的数据符合要求,那么维护进状态
      if(type==='phone'&&phoneReg.test(value)) return this.setState({[type]:value})
      if(type==='verifyCode'&&verifyCodeReg.test(value)) return this.setState({[type]:value})
      else this.setState({[type]:''})
    }
  }
  // 获取验证码的回调
  getVerifyCode=async()=>{
    // 获取手机号
    const {phone,canClick}=this.state
    if(!canClick) return 
    // 更新状态让获取验证码按钮不可点击
    if(!phone) return Toast.show({
      icon: 'fail',
      content: '手机号输入不合法',
    })
    // 开启定时器更新倒计时
    this.setState({canClick:false})
    this.timer=setInterval(()=>{
      let {time}=this.state
      time--
      // 若倒计时结束重置验证码按钮关闭定时器
      if(time<=0){
        clearInterval(this.timer)
        this.setState({canClick:true,time:10})
        return
      }
        this.setState({time})
    },1000)
    // 发送请求
    await reqVerifyCode(phone)
    Toast.show(
      {
        icon: 'success',
        content: '验证码发送成功',
      }
    )

  }
  
  // github授权登录
  githubLogin=()=>{
    window.location.href='https://github.com/login/oauth/authorize?client_id=e9238d1f8812d541f6cc'
  }
  // 登录的回调
  login=async ()=>{
    const {phone,verifyCode}=this.state
    if(!(phone&&verifyCode)){
      return Toast.show(
        {
          icon:"fail",
          content:'请检查手机号或验证码格式'
        }
      )
    }

    const result=await reqLogin(phone,verifyCode)
    const {code,message}=result
    if(code===20000){
      Toast.show({
        icon:"success",
        content:"登录成功"
      })
      this.props.history.push('/usercenter')
    }
    else{
      Toast.show({
        icon:"fail",
        content:'登录失败'+message
      }
      )
    }
  }
  componentWillUnmount(){
    clearInterval(this.timer)
  }
  render() {
    const backArrow=false
    const {time,canClick,phone,verifyCode}=this.state
    return (
      <div className='login'>
        {/* 顶部导航去 */}
        <NavBar backArrow={backArrow}>
          手机验证码登录
        </NavBar>
        {/* 手机号输入框 */}
        <Form layout='horizontal'>
        <Form.Item label='用户电话号码' name='username'>
            <Input onChange={this.savaDate('phone')} placeholder='请输入用户名' clearable />
          </Form.Item>
        {/* 验证码输入框 */}
          <Form.Item
            label='短信验证码'
            extra={
              <div className={styles.extraPart}>
                <Button disabled={canClick} size='mini' onTouchStart={this.getVerifyCode}>
                  发送验证码{canClick?'':`(${time})`}
                  </Button>
              </div>
            }
          >
            <Input onChange={this.savaDate('verifyCode')} placeholder='请输入验证码' clearable />
          </Form.Item>
        </Form>
        {/* 登录按钮 */}
        <Button  
        onTouchEnd={this.login} 
        disabled={(phone&&verifyCode)?false:true}
        className='summitButton' 
        block color='primary' 
        size='large'>
          登录
        </Button>
        {/* 底部其他登录方式区 */}
        <footer className='footer'>
            <span className='other'>其他登录方式</span>
            <div className='login-type'>
              <img src={github} onTouchEnd={this.githubLogin} alt="" />
              <img src={wx} alt="" />
              <img src={qq} alt="" />
            </div>
          <span className='footer-text'>未注册的手机号,验证后会自动创建硅谷账号,登录即代表您同意:<a href='www.baidu.com'>《隐私政策》</a></span>
        </footer>
      </div>
    )
  }
}

usercenter.jsx

import React, { Component } from 'react'
import { NavBar,Toast,Button} from 'antd-mobile'
import {reqVerifyToken,reqLogout} from '../../api/index'
import './index.less'
export default class UserCenter extends Component {
  state={
    nickName:'',
    phone:'',
    avatar:"",
    _id:""
  }
  logout=async ()=>{
    await reqLogout(this.state._id)
    this.props.history.replace('/login')
  }
  async componentDidMount(){
    const result=await reqVerifyToken()
    const {code,message,data,_id}=result
    if(code!==20000){
      Toast.show({
        icon:"fail",
        content:message
      })
      this.props.history.replace('/login')
    }else{
      const {nickName,phone,avatar}=data
      this.setState({nickName,phone,avatar,_id})
    } 
  }
  render() {
    const {nickName,phone,avatar}=this.state
    const backArrow=false
    return (
      <div className='user-info'>
        <NavBar backArrow={backArrow}>
          个人中心
        </NavBar>
        <img className='avatar' src={avatar} alt="" />
        <div>昵称:{nickName}</div>
        <div>电话号码:{phone}</div>
        <Button color='primary' 
        size='large' block
        onTouchEnd={this.logout}
        >退出登录</Button>
      </div>
    )
  }
}

完整项目github地址:https://github.com/Emiria486/reactMobile-login-and-userCenter-pages

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值