翼度科技»论坛 编程开发 JavaScript 查看内容

使用React和Redux Toolkit实现用户登录功能

9

主题

9

帖子

27

积分

新手上路

Rank: 1

积分
27
一、在utils创建loadable.tsx文件

这里是tsx文件,不是ts文件,因为ts文件不识别jsx语法
因为loadable是异步加载,返回的是promise,所以需要对返回的promise进行类型限制
  1. import  Loadable  from "react-loadable.tsx";
  2. const withLoadable = (component:()=>Promise<any>)=>{
  3.         return Loadable({
  4.             loader:component,
  5.             loading:()=><div>加载中</div>,
  6.         })
  7. }
  8. export default withLoadable
复制代码
二、在router文件下创建routes.tsx

这里是tsx文件,不是ts文件,因为ts文件不识别jsx语法

  • 导入RouteObject
  • 导入withLoadable.tsx文件
  • 导入Login组件
  1.     import {RouteObject} from 'react-router-dom'
  2.     import withLoadable from 'withLoadable.tsx文件地址'
  3.     const Login = withLoadable(()=>import('Login.tsx地址'))
  4.     const routes:Array<RouteObject> = [
  5.         {
  6.             path:'/login'
  7.             element:</Login>
  8.         }
  9.     ]
复制代码
三、在index.tsx中配置

导入Browser
  1. import React from 'react';
  2. import ReactDOM from 'react-dom/client';
  3. import App from './App';
  4. import { BrowserRouter } from 'react-router-dom'
  5. const root = ReactDOM.createRoot(
  6.   document.getElementById('root') as HTMLElement
  7. );
  8. root.render(
  9.   <BrowserRouter>
  10.     <App />
  11.   </BrowserRouter>
  12. );
复制代码
四、App.tsx文件配置

useRoutes是Hook组件
  1. import {useRoutes} from 'react-router-dom'
  2. import routes from 'routes地址'
  3. import React from 'react';
  4. function App() {
  5.   return useRoutes(routes)
  6. }
  7. export default App;
复制代码
axios二次封装

导入
  1. import axios,{InternalAxiosRequestConfig,AxiosResponse,AxiosError} from 'axios'
  2. import {TOKEN_KEY} from '../utils/contant'
  3. import {getToken,removeToken} from '../utils/h5Stroe'
  4. import {message} from 'antd'
  5. import {REQUESTURLERROR,TOKENVALDATE} from '../utils/contant'
复制代码
响应拦截器封装:
导入axios的类型声明:AxiosResponse
  1. newAxios.interceptors.response.use((response:AxiosResponse)=>{
  2.     return response
  3. },(error:AxiosError)=>{
  4.     if(error.response){
  5.         switch(error.response.status){
  6.             case 404:
  7.                 message.warning(REQUESTURLERROR)
  8.                 break;
  9.             case 401:
  10.                 message.warning(TOKENVALDATE)
  11.                 removeToken(TOKEN_KEY)
  12.                 break
  13.         }
  14.     }
  15. })
复制代码
请求拦截器的封装
导入axios的类型声明:InternalAxiosRequestConfig
  1. // 请求拦截器
  2. newAxios.interceptors.request.use((req:InternalAxiosRequestConfig)=>{
  3.         req.headers.Authorization =  getToken(TOKEN_KEY)
  4.         return req
  5. })
复制代码
请求封装

创建接口文件对请求参数进行类型限制,下面有user.ts文件
  1. export interface IUser{
  2.     userName:string
  3.     password:Number
  4. }
复制代码
封装登录请求
  1. import request  from "../../utils/axiosApi";
  2. import {IUser} from '../../types/users'
  3. export default {
  4.     login:(data:IUser)=>request.post('/users/login',data)
  5. }
复制代码
组件配置
  1. import React from 'react'
  2. import {Form,Button,Card,Input, message} from 'antd'
  3. import { UserOutlined, LockOutlined} from '@ant-design/icons'
  4. import $api from '../api/index'
  5. import {IUser} from '../types/users'
  6. import * as contant from '../utils/contant'
  7. import {setToken} from '../utils/h5Stroe'
  8. import {TOKEN_KEY} from '../utils/contant'
  9. import {useNavigate} from 'react-router-dom'
  10. export default function Login() {
  11.   const nav = useNavigate()
  12.   const loginApi = async(arg:IUser)=>{
  13.       const result = await $api.user.login(arg)
  14.       console.log(result);
  15.         if(result.data.code){
  16.           setToken(TOKEN_KEY,result.data.token)
  17.           message.success(contant.LoginSuccess)
  18.           nav('/')
  19.         }
  20.   }
  21.   return (
  22.     <div>
  23.       <Card style={{width:'500px'}}>
  24.         <Form onFinish={loginApi}>
  25.           <Form.Item label='账号' name='username' rules={[{ required:true, message:contant.USERNOTNULL}]}>
  26.             <Input prefix={<UserOutlined></UserOutlined>} placeholder='请输入用户名'></Input>
  27.           </Form.Item>
  28.           <Form.Item label='密码' name='password' rules={[{ required:true, message:contant.PASSWORDNOTNULL}]}>
  29.             <Input prefix={<LockOutlined></LockOutlined>} placeholder='请输入密码'></Input>
  30.           </Form.Item>
  31.           <Form.Item>
  32.             <Button type='primary' htmlType='submit'>登录</Button>
  33.           </Form.Item>
  34.         </Form>
  35.       </Card>
  36.     </div>
  37.   )
  38. }
复制代码
到此这篇关于使用React和Redux Toolkit实现用户登录功能的文章就介绍到这了,更多相关React RTK实现登录内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

来源:https://www.jb51.net/article/283909.htm
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

举报 回复 使用道具