React项目实战之租房app项目(九)登录模块基础布局和功能实现

news2024/9/21 0:33:12

前言

目录

  • 前言
  • 一、房屋详情模块
  • 二、登录模块
    • 2.1 登录模块效果图
    • 2.2 基础布局
    • 2.3 调用接口实现登录
    • 2.4 实现表单验证功能
      • 2.4.1 formik介绍
      • 2.4.2 formik基本使用
      • 2.4.3 添加表单验证
    • 2.5 代码优化
  • 总结

一、房屋详情模块

房屋详情模块主要是展示之前获取到的房源信息,由于功能比较简单,这里不做过多赘述

二、登录模块

2.1 登录模块效果图

在这里插入图片描述

2.2 基础布局

在src/pages/Login/index.js中添加如下代码:

<div className={styles.root}>
  {/* 顶部导航 */}
  <NavHeader className={styles.navHeader}>账号登录</NavHeader>
  <WhiteSpace size="xl" />

  {/* 登录表单 */}
  <WingBlank>
    <form>
      <div className={styles.formItem}>
        <input
          className={styles.input}
          name="username"
          placeholder="请输入账号"
        />
      </div>
      <div className={styles.formItem}>
        <input
          className={styles.input}
          name="password"
          type="password"
          placeholder="请输入密码"
        />
      </div>
      <div className={styles.formSubmit}>
        <button className={styles.submit} type="submit">
          登 录
        </button>
      </div>
    </form>
    <Flex className={styles.backHome}>
      <Flex.Item>
        <Link to="/registe">还没有账号,去注册~</Link>
      </Flex.Item>
    </Flex>
  </WingBlank>
</div>

2.3 调用接口实现登录

实现步骤:

1、添加状态:username和password
2、使用受控组件方式获取表单元素值
3、给form表单添加onSubmit
4、创建方法 handleSubmit,实现表单提交
5、在方法中,通过username和password获取到账号和密码
6、使用API调用登录接口,将username和password作为参数
7、判断返回值status为200时候,表示登录成功
8、登录成功后,将token保存到本地存储中(hkzf_token)
9、返回登录前的页面

代码示例:
在src/pages/Login/index.js中添加如下代码:

  state = {
    username: '',
    password: ''
  }

getUserName = e => {
  this.setState({
    username: e.target.value
  })
}

getPassword = e => {
  this.setState({
    password: e.target.value
  })
}

// 表单提交事件的事件处理程序
handleSubmit = async e => {
  // 阻止表单提交时的默认行为
  e.preventDefault()
  // 获取账号和密码
  const { username, password } = this.state

  // 发送请求
  const res = await API.post('/user/login', {
    username,
    password
  })
  const { status, body, description } = res.data
  if (status === 200) {
    // 登录成功
    localStorage.setItem('hkzf_token', body.token)
    this.props.history.go(-1)
  } else {
    // 登录失败
    Toast.info(description, 2, null, false)
  }
}

render() {
    const { username, password } = this.state

    return (
      <div className={styles.root}>
        ...

        {/* 登录表单 */}
        <WingBlank>
          <form onSubmit={this.handleSubmit}>
            <div className={styles.formItem}>
              <input
                className={styles.input}
                value={username}
                onChange={this.getUserName}
                name="username"
                placeholder="请输入账号"
              />
            </div>

            <div className={styles.formItem}>
              <input
                className={styles.input}
                value={password}
                onChange={this.getPassword}
                name="password"
                type="password"
                placeholder="请输入密码"
              />
            </div>
            ...
      </div>
    )
  }
}

2.4 实现表单验证功能

2.4.1 formik介绍

1、使用场景:表单处理,表单验证
2、优势:轻松处理React中的复杂表单,包括:获取表单元素的值,表单验证和错误信息,处理表单提交,并且将这些内容放在一起统一处理,有利于代码阅读,重构,测试等
3、使用方式:1. 高阶组件(withFormik) 2. render-props(<Formik render={() => {}} />

2.4.2 formik基本使用

使用步骤:

1、安装: yarn add formik
2、导入 withFormik,使用withFormit 高阶组件包裹Login组件
3、为withFormit提供配置对象: mapPropsToValues / handleSubmit
4、在Login组件中,通过props获取到values(表单元素值对象),handleSubmit,handleChange
5、使用values提供的值,设置为表单元素的value,使用handleChange设置为表单元素的onChange
6、使用handleSubmit设置为表单的onSubmit
7、在handleSubmit中,通过values获取到表单元素值
8、在handleSubmit中,完成登录逻辑

代码示例:
在src/pages/Login/index.js中添加如下代码:

class Login extends Component {

  render() {
    // 通过 props 获取高阶组件传递进来的属性
    const { values, handleSubmit, handleChange } = this.props

    return (
      <div className={styles.root}>
        {/* 顶部导航 */}
        <NavHeader className={styles.navHeader}>账号登录</NavHeader>
        <WhiteSpace size="xl" />

        {/* 登录表单 */}
        <WingBlank>
          <form onSubmit={handleSubmit}>
            <div className={styles.formItem}>
              <input
                className={styles.input}
                value={values.username}
                onChange={handleChange}
                name="username"
                placeholder="请输入账号"
              />
            </div>
            <div className={styles.formItem}>
              <input
                className={styles.input}
                value={values.password}
                onChange={handleChange}
                name="password"
                type="password"
                placeholder="请输入密码"
              />
            </div>
            <div className={styles.formSubmit}>
              <button className={styles.submit} type="submit">
                登 录
              </button>
            </div>
          </form>
          <Flex className={styles.backHome}>
            <Flex.Item>
              <Link to="/registe">还没有账号,去注册~</Link>
            </Flex.Item>
          </Flex>
        </WingBlank>
      </div>
    )
  }
}

// 使用 withFormik 高阶组件包装 Login 组件,为 Login 组件提供属性和方法
Login = withFormik({
  // 提供状态:
  mapPropsToValues: () => ({ username: '', password: '' }),
  // 表单的提交事件
  handleSubmit: async (values, { props }) => {
    // 获取账号和密码
    const { username, password } = values

    // 发送请求
    const res = await API.post('/user/login', {
      username,
      password
    })

    const { status, body, description } = res.data

    if (status === 200) {
      // 登录成功
      localStorage.setItem('hkzf_token', body.token)

      // 注意:无法在该方法中,通过 this 来获取到路由信息
      // 所以,需要通过 第二个对象参数中获取到 props 来使用 props
      props.history.go(-1)
    } else {
      // 登录失败
      Toast.info(description, 2, null, false)
    }
  }
})(Login)


// 注意:此处返回的是 高阶组件 包装后的组件
export default Login

2.4.3 添加表单验证

实现步骤:

1、安装Yup: yarn add yup 
2、在项目中导入Yup
3、在 withFormik 中添加配置项 validationSchema,使用 Yup 添加表单校验规则
4、在 Login 组件中,通过 props 获取到 errors(错误信息)和 touched(是否访问过,注意:需要给表单元素添加 handleBlur 处理失焦点事件才生效!)
5、在表单元素中通过这两个对象展示表单校验错误信

代码示例:
在src/pages/Login/index.js中添加如下代码:

{/* 登录表单 */}
<WingBlank>
  <form onSubmit={handleSubmit}>
    ...  用户名的错误提示
    {errors.username && touched.username && (
      <div className={styles.error}>{errors.username}</div>
    )}
    ... 密码框的错误提示
    {errors.password && touched.password && (
      <div className={styles.error}>{errors.password}</div>
    )}
    ...
</WingBlank>

// 使用 withFormik 高阶组件包装 Login 组件,为 Login 组件提供属性和方法
Login = withFormik({
  ...
  // 添加表单校验规则
  validationSchema: Yup.object().shape({
    username: Yup.string()
      .required('账号为必填项')
      .matches(REG_UNAME, '长度为5到8位,只能出现数字、字母、下划线'),
    password: Yup.string()
      .required('密码为必填项')
      .matches(REG_PWD, '长度为5到12位,只能出现数字、字母、下划线')
  }),
  ...
})(Login)

2.5 代码优化

优化步骤:

1、导入 Form组件,替换form元素,去掉onSubmit
2、导入Field组件,替换input表单元素,去掉onChange,onBlur,value
3、导入 ErrorMessage 组件,替换原来的错误消息逻辑代码
4、去掉所有 props

代码示例:
在src/pages/Login/index.js中修改如下代码:

// 导入withFormik
import { withFormik, Form, Field, ErrorMessage } from 'formik'

<Form>
  {/* 账号 */}
  <div className={styles.formItem}>
    <Field
      className={styles.input}
      name="username"
      placeholder="请输入账号"
    />
  </div>
  <ErrorMessage
    className={styles.error}
    name="username"
    component="div"
  />
  {/* 密码 */}
  <div className={styles.formItem}>
    <Field
      className={styles.input}
      name="password"
      type="password"
      placeholder="请输入密码"
    />
  </div>
  <ErrorMessage
    className={styles.error}
    name="password"
    component="div"
  />
  <div className={styles.formSubmit}>
    <button className={styles.submit} type="submit">
      登 录
    </button>
  </div>
</Form>

总结

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/196579.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

为防护加码,飞凌嵌入式i.MX93系列开发板让通信安全又稳定

来源&#xff1a;飞凌嵌入式官网www.forlinx.com随着新基建的加快推进&#xff0c;智能制造迎来了更好的发展时机&#xff0c;嵌入式板卡等智能设备也在更多的应用场景中大放异彩。但随着现场的设备数量的剧增&#xff0c;环境中的各种干扰信号也随之增加&#xff0c;这就对设备…

windows下GitHub的SSH key配置

SSH Key 是一种方法来确定受信任的计算机&#xff0c;从而实现免密码登录。 Git是分布式的代码管理工具&#xff0c;远程的代码管理是基于SSH的&#xff0c;所以要使用远程的Git则需要SSH的配置。 下面的步骤将完成 生成SSH密钥 并 添加公共密钥到GitHub上的帐户 先设置GitHub…

Apifox接口测试工具详细解析

最近发现一款接口测试工具--apifox&#xff0c;我我们很难将它描述为一款接口管理工具 或 接口自测试工具。 官方给了一个简单的公式&#xff0c;更能说明apifox可以做什么。 Apifox Postman Swagger Mock JMeter Apifox的特点&#xff1a; 接口文档定义&#xff1a; Apif…

接口测试学习第二天

1、全局变量 概念&#xff1a;在postman全局生效的变量&#xff0c;全局唯一。设置&#xff1a; 代码设置&#xff1a;pm.globals.set("glb_age",100)//示例&#xff1a; pm.globals.set("glb_age",100) 获取&#xff1a; 代码获取&#xff1a;var 接收值…

Java的内部类详解(成员内部类、静态内部类、局部内部类、匿名内部类)

Java知识点总结&#xff1a;想看的可以从这里进入 目录2.2.4、 内部类1、成员内部类2、静态内部类3、局部内部类4、匿名内部类2.2.4、 内部类 一个类定义在另一个类内&#xff0c;那么这个类就是一个内部类&#xff0c;比如&#xff1a;在类A中定义一个类B&#xff0c;B就是内…

英特尔锐炫秒杀RTX 3060,XeSS现已支持超过35款游戏!

一款显卡的性能可以达到什么程度&#xff1f;除了架构、规格等硬件因素&#xff0c;驱动的优化程度同样至关重要。Intel携带Arc锐炫回归独立显卡市场&#xff0c;作为“后起之秀”&#xff0c;驱动的优劣更是关键中的关键。Intel也正是这么做的。2022年6月&#xff0c;Intel正式…

2023 NFT防骗指南:六大骗局,3招带你远离…

网上流传着一句&#xff1a;币圈一天&#xff0c;人间一年。在刚刚过去的农历新年&#xff0c;一直低迷的加密领域迎来了“短暂性复苏”&#xff0c;加密市场总市值重回万亿美元。 同时复苏的还有NFT市场&#xff0c;据欧科云链OKLink链上数据显示&#xff0c;2023年1月份的NFT…

计算机网络-http协议版本对比

概述 HTTP 是基于 TCP/IP 协议的一个应用层协议&#xff0c;是现代互联网的一个基础协议。规定了客户端与服务端之间的通信格式以及所占用的服务端口80(HTTPS是443)。 超文本传输协议&#xff08;Hyper Text Transfer Protocol&#xff0c;HTTP&#xff09;是一个简单的请求-响…

【Flutter】Flutter Developer 101 入门小册 专栏指引

你好&#xff0c;我是小雨青年&#xff0c;一名程序员。 在2023年&#xff0c;我决定做这个Flutter专栏&#xff0c;从基础到部署&#xff0c;一站式解决大家对于Fulltter的学习需求。 目前本专栏的大概目录为本文最后所示&#xff0c;后续随着内容的不断更新&#xff0c;会逐…

2023年“华数杯”国际大学生数学建模B题赛题发布

ICM 问题B&#xff1a;社会稳定早期预警研究 背景 人类和所有的动物一样&#xff0c;都有寻求利益和避免伤害的本能。人类成为创造之主 的关键在于&#xff0c;他们比其他动物更善于避免伤害。危机总是潜伏着未来。人类发展的 历史是一部不断尝试超越危机的历史 (严耀军&#x…

鸿蒙开发学习|基础环境和开发工具

系列文章目录 第一章 HarmonyOS是什么 第二章 基础环境和开发工具 文章目录系列文章目录前言一、DevEco Studio工具简介二、DevEco Studio搭建开发流程1.运行环境要求2.下载和安装DevEco Studio三、安装HarmonyOS开发插件总结前言 HUAWEI DevEco Studio是基于IntelliJ IDEA C…

三阶魔方七步还原法公式备忘录

魔方公式备忘 转动符号图解 魔方七步公式&#xff1a; 1.底面十字还原 2.底角还原 3.中间层还原 上棱到左棱 U’L’U’LUFUF’ 上棱到右棱 URUR’U’F’U’F 4.顶面十字 循环做FRUR’U’F’直到出现十字 5.顶面还原&#xff08;小鱼公式&#xff09; 左手 L’U’LU’L’U’2L …

2、Maven——IDEA与eclipse(MyEclipse)创建工程的区别、Maven创建基本java工程

目录 一、IDEA与eclipse创建工程的区别 二、IDEA创建多个工程 1、 创建空工程&#xff1a;Empty Project 2、创建Module 三、Maven创建基本java工程 1、pom.xml 2、依赖坐标的使用 3、远程Maven仓库 4、Maven项目框架 &#xff08;1&#xff09; main目录 &#xff…

MySQL之主从复制集群搭建

简述 这篇文章主要记录使用docker compose搭建MySQL主从复制集群搭建&#xff0c;方便后续进行本地测试开发。 这篇文章主要介绍一主一从的搭建过程。 主从架构&#xff0c;可以缓解MySQL的数据存储以及访问的压力。 一. 主从复制原理 原理图如下&#xff1a; 步骤&#xf…

AVL平衡树(Java实现)

概念 AVL树可以定义为高度平衡二叉搜索树&#xff0c;其中每个节点与平衡因子相关联&#xff0c;该平衡因子通过从其左子树的子树中减去其右子树的高度来计算。AVL树是由GM Adelson - Velsky和EM Landis于1962年发明的。为了纪念其发明者&#xff0c;这树结构被命名为AVL。 定…

Android集成Unity

前言 随着前两年元宇宙的提出&#xff0c;虚拟现实开始在各大平台大展身手。各个平台都开始搭上了元宇宙的列车&#xff0c;Unity作为虚拟引擎中的热门&#xff0c;渲染效果和开发效率极其出色&#xff1b;Android作为移动开发的巨头之一也搭上了元宇宙这趟列车。今天&#xf…

图像基础概念

加解串器图像相关的概念:相关的概念:一个像素时钟可以产生两个像素可以通过调大frame freelance或vts来增大 V blinking sensor的基本配置曝光:一行一行进行曝光:每一行曝光时间 非常短 从第一行到最后一行为有效时间同步信号:同步信号的处理同步曝光的需求&#xff1a;曝光的…

IoU Loss综述(IOU,GIOU,CIOU,EIOU,SIOU,WIOU)

边界框回归&#xff08;BBR&#xff09;的损失函数对于目标检测至关重要。它的良好定义将为模型带来显著的性能改进。大多数现有的工作假设训练数据中的样本是高质量的&#xff0c;并侧重于增强BBR损失的拟合能力。 一、L2-norm 最初的基于回归的BBR损失定义为L2-norm&#xf…

IIS隐藏敏感数据信息

安装URL Rewrite web.config: 想要隐藏Server和X-AspNet-Version 两项 <system.webServer>节点添加子节点rewrite <system.webServer> <rewrite> <outboundRules> <rule name"REMOVE_RESPONSE_SERVER"> …

python3+requests:接口自动化测试(二)

前言&#xff1a;上篇文章python3requestsunittest&#xff1a;接口自动化测试&#xff08;一&#xff09;&#xff1a;python3requestsunittest&#xff1a;接口自动化测试&#xff08;一&#xff09; - Shapelei - 博客园 &#xff0c;已经介绍了基于unittest框架的实现接口自…