广告
返回顶部
首页 > 资讯 > 精选 >怎么在React中利用Form组件实现一个登录功能
  • 123
分享到

怎么在React中利用Form组件实现一个登录功能

2023-06-14 10:06:07 123人浏览 独家记忆
摘要

本篇文章给大家分享的是有关怎么在React中利用FORM组件实现一个登录功能,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。引入所需的 Antd 组件,代码如下所示:import

本篇文章给大家分享的是有关怎么在React中利用FORM组件实现一个登录功能,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

引入所需的 Antd 组件,代码如下所示:

import { Form, Icon, Input, Button, message } from 'antd'

在 Login.jsx 中,创建一个 Login 组件。当对外暴露组件时,需要使用 Form 组件进行包装,包装 Form 组件生成一个新的组件 Form(Login),同时新组件会向 Form 组件传递一个强大的对象属性 form,这样就可以取到 Form 表单的值,这也是高阶组件和高阶函数的体现,代码如下所示:

class Login extends Component {}const WrapLogin = Form.create()(Login)export default WrapLogin

在 render 内部去渲染表单时,可以先通过 this.props 去拿到 form 表单,在 form 中取得 getFieldDecorator,用于和表单进行双向绑定。在 getFieldDecorator 中,第一项是表单项对应的 value 值,第二项是配置对象,属性名是特定的一些名称。比如,rules 是验证规则,在 rules 中,可以设置 required 为是否必选,message 为校验文案,pattern 为正则表达式校验,max 为最大长度,min 为最小长度。还比如 initialValue 是表单项的初始值。对于 rules 校验,可以使用声明式验证, 也就是直接使用别人定义好的验证规则进行验证,还可以自定义验证 validator,function(rule, value, callback),必须有 callback 回调函数,代码如下所示:

class Login extends Component { validPwd = (rule, value, callback) => {  if (!value) {   callback('密码必须输入')  } else if (value.length < 4) {   callback('密码长度不能小于4位')  } else if (value.length > 12) {   callback('密码长度不能大于12位')  } else if (!/^[a-zA-Z0-9_]+$/.test(value)) {   callback('密码必须是英文、数字或下划线组成')  } else {   callback()  } } render () {  const form = this.props.form  const { getFieldDecorator } = form  return (   <div className="login">    <header className="login-header">     <img src={loGo} alt="logo"></img>     <h2>React 后台管理系统</h2>    </header>    <section className="login-content">     <h3>用户登录</h3>     <Form>      <Form.Item>       {        getFieldDecorator('username', {          rules: [          { required: true, whitespace: true, message: '用户名必须输入'},          { min: 4, message: '用户名至少是4位'},          { max: 12, message: '用户名至少是12位'},          { pattern: /^[a-zA-Z0-9_]+$/, message: '用户名必须是英文、数字或下划线组成'}         ],         // initialValue: 'admin',         })(         <Input          prefix={<Icon type="user" style={{ color: 'rgba(0,0,0,.25)' }} />}          placeholder="用户名"         />        )       }      </Form.Item>      <Form.Item>       {        getFieldDecorator('passWord', {         rules: [          { validator: this.validPwd }         ]        })(         <Input          prefix={<Icon type="lock" style={{ color: 'rgba(0,0,0,.25)' }} />}          type="password"          placeholder="密码"         />        )       }      </Form.Item>      <Form.Item>       <Button type="primary" htmlType="submit" className="login-form-button">         登陆       </Button>      </Form.Item>     </Form>    </section>   </div>  ) }}const WrapLogin = Form.create()(Login)export default WrapLogin

我们可以定义两个工具类,用来操作登录对象,memoryUtils 是用来在内存保存一些数据的工具模块,storageUtils 是进行 local 数据存储管理的工具模块,如下所示:

memoryUtils.js,代码如下所示:

export default { user: {}, product: {}}

storageUtils.js,代码如下所示:

import store from 'store'const USER_KEY = 'user_key'export default { // 保存 user saveUser (user) {  store.set(USER_KEY, user) }, // 读取 user getUser () {  return store.get(USER_KEY) || {} }, // 删除 user removeUser () {  store.remove(USER_KEY) }}

定义登录的接口请求函数,使用 axiOS 可以先进行封装,得到 response.data,如下所示:

ajax.js,代码如下所示:

import axios from 'axios'import {message} from 'antd'export default function ajax(url, data={}, type='GET') { return new Promise((resolve, reject) => {  let promise  if(type==='GET') {    promise = axios.get(url, {    params: data    })  } else {    promise = axios.post(url, data)  }  promise.then(response => {   resolve(response.data)  }).catch(error => {   message.error('请求出错了: ' + error.message)  }) })}

index.js,代码如下所示:

import JSONp from 'jsonp'import ajax from './ajax'import { message } from 'antd'const BASE = ''export const reqLogin = (username, password) => ajax(BASE + '/login', { username, password}, 'POST')export const reqCategories = (parentId) => ajax(BASE + '/manage/category/list', {parentId})export const reqAddCategories = ({parentId, categoryName}) => ajax(BASE + '/manage/category/add', {parentId, categoryName}, 'POST')export const reqUpdateCategories = ({categoryId, categoryName}) => ajax(BASE + '/manage/category/update', {categoryId, categoryName}, 'POST')export const reqCategory = (categoryId) => ajax(BASE + '/manage/category/info', { categoryId })export const reqProducts = ({pageNum, pageSize}) => ajax(BASE + '/manage/product/list', { pageNum, pageSize})export const reqUpdateStatus = ({productId, status}) => ajax(BASE + '/manage/product/updateStatus', {productId, status}, 'POST')export const reqSearchProducts = ({ pageNum, pageSize, searchName, searchType}) => ajax(BASE + '/manage/product/search', { pageNum, pageSize, [searchType]: searchName})export const reqDeleteImg = (name) => ajax(BASE + '/manage/img/delete', {name}, 'POST')export const reqAddUpdateProduct = (product) => ajax(BASE + '/manage/product/' + (product._id ? 'update' : 'add'), product, 'POST')export const reqRoles = () => ajax(BASE + '/manage/role/list')export const reqAddRole = (roleName) => ajax(BASE + '/manage/role/add', {roleName}, 'POST')export const reqUpdateRole = (role) => ajax(BASE + '/manage/role/update', role, 'POST')export const reqUsers = () => ajax(BASE + '/manage/user/list')export const reqDeleteUser = (userId) => ajax(BASE + '/manage/user/delete', {userId}, 'POST')export const reqAddOrUpdateUser = (user) => ajax(BASE + '/manage/user/'+(user._id ? 'update': 'add'), user, 'POST')export const reqWeather = (city) => { return new Promise((resolve, reject) => {  const url = `Http://api.map.baidu.com/telematics/v3/weather?location=${city}&output=json&ak=IOXimfoqOUVq2KcYCiQU9cMF7hyN5kFB`  jsonp(url, {}, (err, data) => {   console.log('jsonp()', err, data)   if (!err && data.status==='success') {    const {dayPictureUrl, weather} = data.results[0].weather_data[0]    resolve({dayPictureUrl, weather})   } else {    message.error('获取天气信息失败!')   }  }) })}

引入这些工具类和接口,代码如下所示:

import { reqLogin } from '../../api'import memoryUtils from '../../utils/memoryUtils'import storageUtils from '../../utils/storageUtils'

给 Form 表单绑定 onSubmit 事件,handleSubmit。在这个事件中,需要先使用 event.preventDefault() 阻止事件的默认行为。如果想要获取表单项的输入数据,可以使用 form.getFieldsValue()。但是,在提交表单前需要对表单数据进行预校验,使用 this.props.form.validateFields 进行预校验,validateFields 可以获取所有表单字段的值,并且可以判断表单数据是否有错。如有 没错,说明预校验通过,从 values 中获取 username 和 password 的值,然后通过 reqLogin 这个接口结合 async 和 await 发起登录请求。如果响应的状态码正确,说明登录成功,保存 user,保存在内存和本地中,然后使用 this.props.history.replace 跳转到主管理界面中,反之则登录失败。在 render 中,如果用户已经登陆, 需要使用 Redirect 自动跳转到主管理界面中,代码如下所示:

 handleSubmit = (event) => {  event.preventDefault()  this.props.form.validateFields(async (err, values) => {   if (!err) {    const { username, password } = values    const result = await reqLogin(username, password)    if (result.status === 0) {      message.success('登录成功')     const user = result.data     memoryUtils.user = user     storageUtils.saveUser(user)     this.props.history.replace('/')    } else {      message.error(result.msg)    }   } else {    console.log(err)   }  })

二、React 结合 Antd 实现登录功能的实现

React 结合 Antd 实现登录功能的实现,完整代码如下所示:
login.jsx,代码如下所示:

import React, { Component } from 'react'import { Form, Icon, Input, Button, message } from 'antd'import { Redirect } from 'react-router-dom'import './login.less'import logo from '../../assets/images/logo.png'import { reqLogin } from '../../api'import memoryUtils from '../../utils/memoryUtils'import storageUtils from '../../utils/storageUtils'class Login extends Component { handleSubmit = (event) => {  event.preventDefault()  this.props.form.validateFields(async (err, values) => {   if (!err) {    const { username, password } = values    const result = await reqLogin(username, password)    if (result.status === 0) {      message.success('登录成功')     const user = result.data     memoryUtils.user = user     storageUtils.saveUser(user)     this.props.history.replace('/')    } else {      message.error(result.msg)    }   } else {    console.log(err)   }  }) } validPwd = (rule, value, callback) => {  if (!value) {   callback('密码必须输入')  } else if (value.length < 4) {   callback('密码长度不能小于4位')  } else if (value.length > 12) {   callback('密码长度不能大于12位')  } else if (!/^[a-zA-Z0-9_]+$/.test(value)) {   callback('密码必须是英文、数字或下划线组成')  } else {   callback()  } } render () {  const user = memoryUtils.user  if (user && user._id) {   return <Redirect to="/"></Redirect>  }  const form = this.props.form  const { getFieldDecorator } = form  return (   <div className="login">    <header className="login-header">     <img src={logo} alt="logo"></img>     <h2>React 后台管理系统</h2>    </header>    <section className="login-content">     <h3>用户登录</h3>     <Form onSubmit={this.handleSubmit}>      <Form.Item>       {        getFieldDecorator('username', {          rules: [          { required: true, whitespace: true, message: '用户名必须输入'},          { min: 4, message: '用户名至少是4位'},          { max: 12, message: '用户名至少是12位'},          { pattern: /^[a-zA-Z0-9_]+$/, message: '用户名必须是英文、数字或下划线组成'}         ],         // initialValue: 'admin',        })(         <Input          prefix={<Icon type="user" style={{ color: 'rgba(0,0,0,.25)' }} />}          placeholder="用户名"         />        )       }      </Form.Item>      <Form.Item>       {        getFieldDecorator('password', {         rules: [          { validator: this.validPwd }         ]        })(         <Input          prefix={<Icon type="lock" style={{ color: 'rgba(0,0,0,.25)' }} />}          type="password"          placeholder="密码"         />        )       }      </Form.Item>      <Form.Item>       <Button type="primary" htmlType="submit" className="login-form-button">         登陆       </Button>      </Form.Item>     </Form>    </section>   </div>  ) }}const WrapLogin = Form.create()(Login)export default WrapLogin

login.less,代码如下所示:

.login { width: 100%; height: 100%; background-image: url('./images/bg.jpg'); background-size: 100% 100%; .login-header {  display: flex;  align-items: center;  height: 80px;  background-color: rgba(21, 20, 13, 0.5);  img {   width: 40px;   height: 40px;   margin: 0 15px 0 50px;  }  h2 {   font-size: 30px;   color: white;  } } .login-content {  width: 400px;  height: 300px;  background-color: #fff;  margin: 50px auto;  padding: 20px 40px;  h3 {   text-align: center;   font-size: 30px;   font-weight:bold;   margin-bottom: 20px;  }  .login-form {   .login-form-button {    width: 100%;   }  } }}

以上就是怎么在React中利用Form组件实现一个登录功能,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注编程网精选频道。

--结束END--

本文标题: 怎么在React中利用Form组件实现一个登录功能

本文链接: https://www.lsjlt.com/news/269966.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 怎么在React中利用Form组件实现一个登录功能
    本篇文章给大家分享的是有关怎么在React中利用Form组件实现一个登录功能,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。引入所需的 Antd 组件,代码如下所示:import...
    99+
    2023-06-14
  • 利用struts1怎么实现一个登录功能
    利用struts1怎么实现一个登录功能?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。实例开始工作—导入jar包,在官网上下载struts1框架包,解压之后导入工...
    99+
    2023-05-31
    struts2 st
  • 详解对于React结合Antd的Form组件实现登录功能
    目录一、React 结合 Antd 实现登录功能 二、React 结合 Antd 实现登录功能的实现 一、React 结合 Antd 实现登录功能 引入所需的 Antd 组件,代码...
    99+
    2022-11-12
  • 怎么在SpringBoot中利用Shiro实现一个密码登录功能
    怎么在SpringBoot中利用Shiro实现一个密码登录功能?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。导入依赖(pom.xml) <!--...
    99+
    2023-06-06
  • 怎么在React中利用路由实现一个登录界面的跳转
    怎么在React中利用路由实现一个登录界面的跳转?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。首先看一下总体的目录结构。因为很多时候在看别人写的例子的时候因为目录结构不熟悉后边...
    99+
    2023-06-14
  • React如何利用Antd的Form组件实现表单功能详解
    一、构造组件 1、表单一定会包含表单域,表单域可以是输入控件,标准表单域,标签,下拉菜单,文本域等。 这里先引用了封装的表单域 <Form.Item /> 2、使用For...
    99+
    2022-11-12
  • 使用ajax怎么实现一个登录功能
    本篇文章给大家分享的是有关使用ajax怎么实现一个登录功能,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。ajax的优点:最大的一点是页面无刷新,用户的体验非常好。使用异步方式与...
    99+
    2023-06-08
  • 怎么在Centos中利用文件实现一个swap功能
    怎么在Centos中利用文件实现一个swap功能?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。创建swap文件mkdir/var/swap#创建一个文件夹用于存放交换分区文件,...
    99+
    2023-06-10
  • 怎么在java中使用JDBC实现一个验证登录功能
    怎么在java中使用JDBC实现一个验证登录功能?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。java基本数据类型有哪些Java的基本数据类型分为:1、整数类型,用来表示整...
    99+
    2023-06-14
  • 怎么在android中实现一个微信联合登录功能
    怎么在android中实现一个微信联合登录功能?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。1):登录微信开放平台,完成账号申请:https://open.weixin.qq....
    99+
    2023-05-30
    android
  • 使用React怎么实现一个登录表单
    这篇文章将为大家详细讲解有关使用React怎么实现一个登录表单,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。代码如下:import React from ...
    99+
    2023-06-14
  • 怎么在JavaWeb中利用Session实现一个用户登陆注销功能
    今天就跟大家聊聊有关怎么在JavaWeb中利用Session实现一个用户登陆注销功能,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。Cookie:cookie是客户端技术,程序把每个用...
    99+
    2023-05-30
    javaweb session
  • 如何在SpringBoot中使用Shiro怎么实现一个邮件验证码登录功能
    如何在SpringBoot中使用Shiro怎么实现一个邮件验证码登录功能?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。导入依赖(pom.xml)  &...
    99+
    2023-06-06
  • 怎么在Java中利用JavaMail实现一个邮件发送功能
    这期内容当中小编将会给大家带来有关怎么在Java中利用JavaMail实现一个邮件发送功能,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。1. 电子邮件协议电子邮件的在网络中传输和网页一样需要遵从特定的协议...
    99+
    2023-05-31
    java javamail ava
  • 怎么在HTML5中Blob利用实现一个文件下载功能
    怎么在HTML5中Blob利用实现一个文件下载功能?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。$("#exportAll").on(&qu...
    99+
    2023-06-09
  • 怎么在Android中利用ImageView控件实现一个圆角功能
    今天就跟大家聊聊有关怎么在Android中利用ImageView控件实现一个圆角功能,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。创建CustomImageView 类在你的项目中(...
    99+
    2023-05-31
    android age imageview
  • 怎么在Android中利用DownloadManager实现一个文件下载功能
    本篇文章为大家展示了怎么在Android中利用DownloadManager实现一个文件下载功能,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Android中DownloadManager实现文件下...
    99+
    2023-05-31
    android downloadmanager age
  • 在Android开发中利用MediaRecorder实现一个录音功能
    这篇文章给大家介绍在Android开发中利用MediaRecorder实现一个录音功能,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。代码如下:public class MediaRecorderActivity ext...
    99+
    2023-05-31
    android mediarecorder roi
  • 如何在Android中利用MediaRecorder实现一个录像功能
    今天就跟大家聊聊有关如何在Android中利用MediaRecorder实现一个录像功能,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。在AndroidManifest.xml加入以下...
    99+
    2023-05-31
    android mediarecorder roi
  • 怎么使用react实现一个tab组件
    本教程操作环境:windows7系统、react18.0.0版、Dell G3电脑。怎么使用react实现一个tab组件?react写Tab组件使用react写TAB栏组件和对应hover事件(背景:在用gatsby开发页面时,遇到这样的组...
    99+
    2022-11-22
    tab组件 React
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作