位置: IT常识 - 正文

前端实战|React18极客园——登陆模块(token持久化、路由拦截、mobx、封装axios)(前端实战面试题)

编辑:rootadmin
前端实战|React18极客园——登陆模块(token持久化、路由拦截、mobx、封装axios)

推荐整理分享前端实战|React18极客园——登陆模块(token持久化、路由拦截、mobx、封装axios)(前端实战面试题),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:前端实战训练营,前端实战项目11套,前端实战项目推荐,前端实战项目11套,前端实战案例,前端实战项目11套,前端实战项目推荐,前端实战项目,内容如对您有帮助,希望把文章链接给更多的朋友!

欢迎来到我的博客 📔博主是一名大学在读本科生,主要学习方向是前端。 🍭目前已经更新了【Vue】、【React–从基础到实战】、【TypeScript】等等系列专栏 🛠目前正在学习的是🔥React框架React框架React框架🔥,中间穿插了一些基础知识的回顾 🌈博客主页👉codeMak1r.小新的博客

😇本文目录😇登陆模块1.基本结构模块2. 创建表单结构3. 表单校验实现4. 获取登录表单数据5. 封装http工具模块6. 配置登录Mobx7. 实现登录逻辑8. token持久化封装工具函数持久化设置9. axios请求拦截器注入token10. 路由导航守卫

本文被专栏【React–从基础到实战】收录 🕹坚持创作✏️,一起学习📖,码出未来👨🏻‍💻!

最近在学习React过程中,找到了一个实战小项目,在这里与大家分享。 本文遵循项目开发流程,逐步完善各个需求 前文——《项目前置准备》

登陆模块1.基本结构模块

本节目标: 能够使用antd搭建基础布局

实现步骤

在 Login/index.js 中创建登录页面基本结构在 Login 目录中创建 index.scss 文件,指定组件样式将 logo.png 和 login.png 拷贝到 assets 目录中

代码实现

pages/Login/index.js

import { Card } from 'antd'import logo from '@/assets/logo.png'import './index.scss'const Login = () => { return ( <div className="login"> <Card className="login-container"> <img className="login-logo" src={logo} alt="" /> {/* 登录表单 */} </Card> </div> )}export default Login

pages/Login/index.scss

.login { width: 100%; height: 100%; position: absolute; left: 0; top: 0; background: center/cover url('~@/assets/login.png'); .login-logo { width: 200px; height: 60px; display: block; margin: 0 auto 20px; } .login-container { width: 440px; height: 360px; position: absolute; left: 50%; top: 50%; transform: translate(-50%, -50%); box-shadow: 0 0 50px rgb(0 0 0 / 10%); } .login-checkbox-label { color: #1890ff; }}2. 创建表单结构

本节目标: 能够使用antd的Form组件创建登录表单

实现步骤

打开 antd Form 组件文档找到代码演示的第一个示例(基本使用),点击<>(显示代码),并拷贝代码到组件中分析 Form 组件基本结构调整 Form 组件结构和样式

代码实现

pages/Login/index.js

import { Form, Input, Button, Checkbox } from 'antd'const Login = () => { return ( <Form> <Form.Item> <Input size="large" placeholder="请输入手机号" /> </Form.Item> <Form.Item> <Input size="large" placeholder="请输入验证码" /> </Form.Item> <Form.Item> <Checkbox className="login-checkbox-label"> 我已阅读并同意「用户协议」和「隐私条款」 </Checkbox> </Form.Item> <Form.Item> <!-- 渲染Button组件为submit按钮 --> <Button type="primary" htmlType="submit" size="large" block> 登录 </Button> </Form.Item> </Form> )}3. 表单校验实现

本节目标: 能够为手机号和密码添加表单校验

实现步骤

为 Form 组件添加 validateTrigger 属性,指定校验触发时机的集合为 Form.Item 组件添加 name 属性,这样表单校验才会生效为 Form.Item 组件添加 rules 属性,用来添加表单校验

代码实现

page/Login/index.js

const Login = () => { return ( <Form validateTrigger={['onBlur', 'onChange']}> <Form.Item name="mobile" rules={[ { pattern: /^1[3-9]\d{9}$/, message: '手机号码格式不对', validateTrigger: 'onBlur' }, { required: true, message: '请输入手机号' } ]} > <Input size="large" placeholder="请输入手机号" /> </Form.Item> <Form.Item name="code" rules={[ { len: 6, message: '验证码6个字符', validateTrigger: 'onBlur' }, { required: true, message: '请输入验证码' } ]} > <Input size="large" placeholder="请输入验证码" maxLength={6} /> </Form.Item> <Form.Item name="remember" valuePropName="checked"> <Checkbox className="login-checkbox-label"> 我已阅读并同意「用户协议」和「隐私条款」 </Checkbox> </Form.Item> <Form.Item> <Button type="primary" htmlType="submit" size="large" block> 登录 </Button> </Form.Item> </Form> )}4. 获取登录表单数据

本节目标: 能够拿到登录表单中用户的手机号码和验证码

实现步骤

为 Form 组件添加 onFinish 属性,该事件会在点击登录按钮时触发创建 onFinish 函数,通过函数参数 values 拿到表单值Form 组件添加 initialValues 属性,来初始化表单值

代码实现

pages/Login/index.js

// 点击登录按钮时触发 参数values即是表单输入数据const onFinish = values => { console.log(values)}<Form onFinish={ onFinish } initialValues={{ mobile: '13911111111', code: '246810', remember: true }}>...</Form>5. 封装http工具模块

本节目标: 封装axios,简化操作

实现步骤

创建 utils/http.js 文件创建 axios 实例,配置 baseURL,请求拦截器,响应拦截器在 utils/index.js 中,统一导出 http

代码实现

utils/http.js

import axios from 'axios'const http = axios.create({ baseURL: 'http://geek.itheima.net/v1_0', timeout: 5000})// 添加请求拦截器http.interceptors.request.use((config)=> { return config }, (error)=> { return Promise.reject(error)})// 添加响应拦截器http.interceptors.response.use((response)=> { // 2xx 范围内的状态码都会触发该函数。 // 对响应数据做点什么 return response }, (error)=> { // 超出 2xx 范围的状态码都会触发该函数。 // 对响应错误做点什么 return Promise.reject(error)})export { http }

utils/index.js

import { http } from './http'export { http }6. 配置登录Mobx

本节目标: 基于mobx封装管理用户登录的store

store/login.Store.js

// 登录模块import { makeAutoObservable } from "mobx"import { http } from '@/utils'class LoginStore { token = '' constructor() { makeAutoObservable(this) } // 登录 login = async ({ mobile, code }) => { const res = await http.post('http://geek.itheima.net/v1_0/authorizations', { mobile, code }) this.token = res.data.token }}export default LoginStore前端实战|React18极客园——登陆模块(token持久化、路由拦截、mobx、封装axios)(前端实战面试题)

store/index.js

import React from "react"import LoginStore from './login.Store'class RootStore { // 组合模块 constructor() { this.loginStore = new LoginStore() }}// 导入useStore方法供组件使用数据const StoresContext = React.createContext(new RootStore())export const useStore = () => React.useContext(StoresContext)7. 实现登录逻辑

本节目标: 在表单校验通过之后通过封装好的store调用登录接口

实现步骤

使用useStore方法得到loginStore实例对象在校验通过之后,调用loginStore中的login函数登录成功之后跳转到首页

代码实现

import { useStore } from '@/store'const onFinish = async (values) => { // 存储登录成功的token try { await loginStore.setToken(values) navigate('/', { replace: true }) message.success('At Your Service, Sir!', 2) } catch (error) { message.error(error.response?.data?.message || '登录失败') } }; const onFinishFailed = (errorInfo) => { const [name] = errorInfo.errorFields[0].name if (name === "captcha") message.error('登录失败,请检查验证码是否有误!', 2); if (name === "tel") message.error('登录失败,请检查手机号是否有误!', 2); } return (...)}8. token持久化封装工具函数

本节目标: 能够统一处理 token 的持久化相关操作,确保刷新后 token 不丢失。

实现步骤

创建 utils/token.js 文件分别提供 getToken/setToken/clearToken/isAuth 四个工具函数并导出创建 utils/index.js 文件,统一导出 token.js 中的所有内容,来简化工具函数的导入将登录操作中用到 token 的地方,替换为该工具函数

代码实现

utils/token.js

const TOKEN_KEY = 'geek_pc'const getToken = () => localStorage.getItem(TOKEN_KEY)const setToken = token => localStorage.setItem(TOKEN_KEY, token)const clearToken = () => localStorage.removeItem(TOKEN_KEY)export { getToken, setToken, clearToken }持久化设置

本节目标: 使用token函数持久化配置

实现步骤

拿到token的时候一式两份,存本地一份初始化的时候优先从本地取,取不到再初始化为控制

代码实现

store/login.Store.js

// 登录模块import { makeAutoObservable } from "mobx"import { setToken, getToken, clearToken, http } from '@/utils'class LoginStore { // 这里哦!! token = getToken() || '' constructor() { makeAutoObservable(this) } // 登录 login = async ({ mobile, code }) => { const res = await http.post('http://geek.itheima.net/v1_0/authorizations', { mobile, code }) this.token = res.data.token // 还有这里哦!! setToken(res.data.token) }}export default LoginStore9. axios请求拦截器注入token

《Vue/React项目实现axios请求拦截器注入token》

本节目标: 把token通过请求拦截器注入到请求头中

拼接方式:config.headers.Authorization = Bearer ${token}}

utils/http.js

http.interceptors.request.use(config => { const token = getToken('pc-key') if (token) { config.headers.Authorization = `Bearer ${token}` } return config})

第一次发起请求,是登录请求,此时,localStorage中没有token,getToken获取不到,不走下面这个if函数体,直接return config;

后面再发请求时,由于已经登录了,此时,localStorage中有token,getToken获取到了,走if中的函数体,在发起请求前自动进行预处理,追加一个token,以便于访问需要权限的页面

为请求头对象(headers)中添加token验证的自定义字段(Authorization),作用是为了让需要验证才能使用的API能够使用(请求头中携带了token值则可通过验证)

在最后必须return config

10. 路由导航守卫

【Vue/React实现路由鉴权/导航守卫/路由拦截(react-router v6)】

本节目标: 能够实现未登录时访问拦截并跳转到登录页面(路由鉴权实现)

实现思路

自己封装 AuthRoute 路由鉴权高阶组件,实现未登录拦截,并跳转到登录页面

思路为:判断本地是否有token,如果有,就返回子组件,否则就重定向到登录Login

实现步骤

在 components 目录中,创建 AuthRoute/index.js 文件判断是否登录登录时,直接渲染相应页面组件未登录时,重定向到登录页面将需要鉴权的页面路由配置,替换为 AuthRoute 组件渲染

代码实现

components/AuthRoute/index.js

// 路由鉴权// 1. 判断token是否存在// 2. 如果存在 直接正常渲染// 3. 如果不存在 重定向到登录路由import { Navigate } from "react-router-dom";import { getToken } from "@/utils";// 高阶组件:把一个组件当成另外一个组件的参数传入 然后通过一定的判断 返回新的组件// 这里的AuthRoute就是一个高阶组件function AuthRoute({ children }) { // 获取token const tokenStr = getToken() // 如果token存在 直接正常渲染 if (tokenStr) { return <>{children}</> } // 如果token不存在,重定向到登录路由 else { return <Navigate to='/login' replace /> }}{/* <AuthRoute> <Layout /> </AuthRoute> 登录:<> <Layout /> </> 非登录:<Navigate to="/login" replace />*/ }export { AuthRoute }

注:utils工具函数getToken如下

// 从localstorage中取tokenconst getToken = () => {return window.localStorage.getItem(key)}

src/routes/index.js路由表文件

import Layout from "@/pages/Layout";import Login from "@/pages/Login";import { AuthRoute } from "@/components/AuthRoute";// eslint-disable-next-lineexport default [ // 不需要鉴权的组件Login { path: "/login", element: <Login /> }, // 需要鉴权的组件Layout { path: "/", element: <AuthRoute> <Layout /> </AuthRoute> }]

下篇文章:Layout布局模块的实现 专栏订阅入口【React–从基础到实战】

本文链接地址:https://www.jiuchutong.com/zhishi/300108.html 转载请保留说明!

上一篇:Vue(ref和$refs属性介绍与使用)

下一篇:【HTML | CSS】春节将至,为网页挂上精美的灯笼吧(附源码)程序员的浪漫(_ html)

  • 支付宝2021中秋付款码皮肤怎么领取(支付宝中秋月饼活动)

    支付宝2021中秋付款码皮肤怎么领取(支付宝中秋月饼活动)

  • 小米手机怎么分享wifi密码给朋友(小米手机怎么分身)

    小米手机怎么分享wifi密码给朋友(小米手机怎么分身)

  • 交管12123怎么查询预约结果(交管12123怎么查询非本人车辆违章)

    交管12123怎么查询预约结果(交管12123怎么查询非本人车辆违章)

  • vivo NEX 3s有没有NFC功能呢(vivo nex 3s有耳机孔吗)

    vivo NEX 3s有没有NFC功能呢(vivo nex 3s有耳机孔吗)

  • e5400cpu相当于i几(e5400 cpu参数怎么样)

    e5400cpu相当于i几(e5400 cpu参数怎么样)

  • 微信拍视频抖动怎么解决(微信视频聊天抖动)

    微信拍视频抖动怎么解决(微信视频聊天抖动)

  • 华为p40反向充电怎么设置(华为p40反向充电怎么关闭)

    华为p40反向充电怎么设置(华为p40反向充电怎么关闭)

  • 苹果充电线黑点怎么办(苹果充电线黑点怎么回事)

    苹果充电线黑点怎么办(苹果充电线黑点怎么回事)

  • 无线桥接影响网速吗(无线桥接影响网速怎么设置)

    无线桥接影响网速吗(无线桥接影响网速怎么设置)

  • 办理了5G套餐可以退订吗(办理5g套餐可以用4g吗)

    办理了5G套餐可以退订吗(办理5g套餐可以用4g吗)

  • 辅存储器可分为哪两类(存储器可分为( )和辅助存储器两大类)

    辅存储器可分为哪两类(存储器可分为( )和辅助存储器两大类)

  • 电话卡没信号是主板坏了吗(电话卡没信号是怎么回事儿)

    电话卡没信号是主板坏了吗(电话卡没信号是怎么回事儿)

  • 数据库系统具有什么特点(数据库系统具有数据的)

    数据库系统具有什么特点(数据库系统具有数据的)

  • 华为gt2能插电话卡吗(华为手表新款gt2能接电话吗)

    华为gt2能插电话卡吗(华为手表新款gt2能接电话吗)

  • 微信从黑名单恢复好友,对方有通知吗(微信从黑名单恢复能收到以前的信息吗)

    微信从黑名单恢复好友,对方有通知吗(微信从黑名单恢复能收到以前的信息吗)

  • 抖音上拼多多链接怎么弄(抖音上拼多多链接抢iphone13是真的吗)

    抖音上拼多多链接怎么弄(抖音上拼多多链接抢iphone13是真的吗)

  • 快手怎么设置壁纸(快手怎么设置壁纸背景)

    快手怎么设置壁纸(快手怎么设置壁纸背景)

  • 淘宝怎么改支付方式(淘宝怎么改支付宝账号绑定)

    淘宝怎么改支付方式(淘宝怎么改支付宝账号绑定)

  • 小米9官方标配有什么(小米官方标配与套餐一的区别)

    小米9官方标配有什么(小米官方标配与套餐一的区别)

  • 钉钉怎么关联菜鸟裹裹(钉钉怎么关联组织)

    钉钉怎么关联菜鸟裹裹(钉钉怎么关联组织)

  • 百度网盘如何注销(百度网盘如何注销手机号)

    百度网盘如何注销(百度网盘如何注销手机号)

  • 短信设置在哪里(华为荣耀手机短信设置在哪里)

    短信设置在哪里(华为荣耀手机短信设置在哪里)

  • 抖音喜欢的视频怎么隐藏(抖音喜欢的视频别人能看到吗)

    抖音喜欢的视频怎么隐藏(抖音喜欢的视频别人能看到吗)

  • 手机卡能存多少联系人(手机卡能存多少手机号)

    手机卡能存多少联系人(手机卡能存多少手机号)

  • amr文件是什么详细介绍(amr文件下载)

    amr文件是什么详细介绍(amr文件下载)

  • Win10 21H1将删除Flash Player 7月将通过星期二补丁彻底删除(win10删除了此电脑)

    Win10 21H1将删除Flash Player 7月将通过星期二补丁彻底删除(win10删除了此电脑)

  • kernels32.exe是什么进程 有什么作用 kernels32进程查询(kernel32在哪个文件夹)

    kernels32.exe是什么进程 有什么作用 kernels32进程查询(kernel32在哪个文件夹)

  • 班夫国家公园中莫兰湖的延时视频,加拿大艾伯塔省 (© Schroptschop/Getty Images)(班夫国家公园最佳旅游时间)

    班夫国家公园中莫兰湖的延时视频,加拿大艾伯塔省 (© Schroptschop/Getty Images)(班夫国家公园最佳旅游时间)

  • Python大作业-网络爬虫程序(python大作业小游戏)

    Python大作业-网络爬虫程序(python大作业小游戏)

  • 全网独家首发|极致版YOLOv7改进大提升(推荐)网络配置文件仅24层!更清晰更方便更快的改进YOLOv7网络模型(全网首发是什么意思)

    全网独家首发|极致版YOLOv7改进大提升(推荐)网络配置文件仅24层!更清晰更方便更快的改进YOLOv7网络模型(全网首发是什么意思)

  • 人人都可用chatgpt开发小项目(人人都能用英语pdf下载)

    人人都可用chatgpt开发小项目(人人都能用英语pdf下载)

  • 税务ukey电子发票二维码用什么扫码
  • 企业境外参展 人员成本
  • 增值税欠缴
  • 小企业会计利润报表
  • 航运(集团)招聘
  • 常见的会计凭证有哪些
  • 土地增值税清算扣除项目
  • 押金无法退回
  • 产品质量赔款的账务处理
  • 已经交税的收入退款会计分录
  • 个人开增值税普通发票税率
  • 工伤保险费的缴纳,以下正确的是
  • 没交社保能扣工伤保险吗
  • 挂靠管理费有收税前还是收税后?
  • 税收分类编码里的劳务是劳务派遣的意思吗
  • 员工报销医药费计入什么费用
  • 企业残疾人保障金
  • 享受企业所得税税额抵免优惠的设备包括
  • 委托收款有哪些
  • 库存现金清查短款会计分录
  • 进项税和销项税抵扣的会计分录
  • 企业无偿借款要缴税吗
  • 小规模应交税费有三级科目吗
  • 公积金可以在个税前全额扣除吗
  • 样品送出,不收款怎么做账?
  • macbookair网页全屏
  • 充积分送手机
  • 罗马尼亚卫生部长
  • 往来账会计怎么做
  • 代买车船税怎么挣钱
  • 累计折旧额怎么计算公式
  • 坏账准备怎么做会计科目
  • 期货保证金的计算公式当日盈亏怎么算
  • win10显示未充电
  • thinkphp多数据库连接
  • 融资租赁业务的特点
  • 企业通讯费管理办法
  • 改征增值税是什么意思
  • 公司交纳社会保险多少钱
  • 前端promise封装
  • php 面向对象
  • web前端面试基础知识
  • python pyecharts
  • 质量事故发生后,有责任就所发生的质量事故
  • 可供出售金融资产公允价值变动
  • 小微企业所得额如何计算
  • 固定资产一次性折旧账务处理
  • mysql常用命令有哪些
  • 工程施工企业收入1750万,利润怎么算
  • 货物已到发票未开具
  • 可供出售金融资产是流动资产吗
  • 房地产采取按揭销售的,其销售的入账时间为
  • 管家婆怎样月末结账?
  • 主营业务成本工资写什么部门
  • 应交税费包括哪些科目
  • 小微企业免征的增值税属于政府补助吗
  • 费用报销单如何粘贴票据
  • 待清算商户款项分录的摘要是什么
  • 常见的账务处理程序主要有
  • myeclipse连接mysql要装软件吗
  • win7清除usb插拔记录
  • Windows 10 PC/Mobile Build 14965预览版推送:改进PC端
  • 怎么用winxp的系统光盘启动
  • windows隐藏文件夹开启
  • linux怎样浏览文件中的内容
  • docker 自启动
  • wind8系统怎么清除所有东西 恢复出厂
  • win7电脑键盘失灵怎么解决
  • 订书针的原理
  • 如何将电脑的win7系统变为win10
  • Win7如何开启蓝牙
  • win7双击有声音
  • 批处理命令教程 pdf
  • jQuery展示表格点击变色、全选、删除
  • bat批处理删除
  • unity数据结构和算法
  • python如何获取
  • javascript怎么学
  • android数据存储文件读写实验
  • 贵州国家税务局陈开平
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设