首页 > 其他分享 >配置路由表及登录态校验

配置路由表及登录态校验

时间:2023-04-12 20:37:41浏览次数:31  
标签:登录 校验 path 组件 import 路由 路由表

前几天我完成了一个哔哩哔哩的博主视频下的一个react项目,借此项目来巩固学习的知识,这篇文章主要记录我在该项目用到的路由知识

配置路由表

在src下新建一个router文件夹,在router文件夹下新建index.jsrouter.js

router.js是将将项目中的所有路由引入并制作成一张路由表,在该文件下可以进行组件路由路径配置、组件路由名称配置、组件路由携带属性配置、路由的懒加载配置和路由缓存配置等。

具体配置代码:

//  router.js文件
import { lazy } from "react";
import Home from '../views/Home'
import { withKeepAlive } from 'keepalive-react-component';
const routes = [
    {
        path: '/',
        name: 'home',
        //  使用"keepalive-react-component"插件实现该页面缓存,即在跳转到其他页面后再次返回不会重新刷新页面,保持原有的滚动位置和数据
        component: withKeepAlive(Home, { cacheId: 'home', srcoll: true }),
        //  设置组件携带title
        meta: {
            title: '知乎日报-WebApp'
        }
    },
    {
        //  params形式路由传参,需要在路由表中提前留好参数位置
        path: '/detail/:id',
        name: 'name',
        component: withKeepAlive(lazy(() => import('../views/Detail')), { cacheId: 'detail', srcoll: true }),
        meta: {
            title: '新闻详情-知乎日报'
        }
    },
    {
        path: '/personal',
        name: 'personal',
        //  使用 lazy 实现路由懒加载
        component: lazy(() => import('../views/Personal')),
        meta: {
            title: '个人中心-知乎日报'
        }
    },
    // 剩下的配置大同小异,不在展示··········
];
//  暴露路由表
export default routes;

index.js文件是路由的真正配置文件,将router.js文件中导出的路由表使用map动态生成Route路由

//  router.js文件
export default function RouterView() {
    return (
        <Suspense fallback={<Mask visible={true}><DotLoading color="white" /></Mask>}>
            <Routes>
                {routers.map(item => {
                    let { name, path } = item;
                    return <Route key={name} path={path} element={<Element {...item} />} />;
                })}
            </Routes>
        </Suspense>
    )
};
  • Suspense 是用在路由懒加载中,当路由页面没有渲染出来时,渲染fallback的返回值,fallback中的一般都是一个加载中的动画,用于减少白屏和过渡,提升体验,在这里我使用的是 antd-mobile 插件带的加载效果 Mask,可以自行去官网学习如何使用
  • router6 使用关键字 Routes 包在 Route 外,取代了原先5时的 Switch
  • 使用 map 循环生成 Route,key关键字是一定需要的,在所有使用到 map 生成的元素都必须要保证 key 值的唯一性
  • element=<Element {...item} />是将路由信息传递给自己包装的 Element 组件,可以在 Element 组件中进行一些操作,比如传值,修改页面标题和登录态校验
//  Element组件+登录态校验
//  假定 checkList 中的路径是需要进行登录态校验的,该方法用于判断是否需要进行登录态校验操作
const isCheckLogin = (path) => {
    //  从redux中获取登录信息,base中存放了登录信息
    let { base: { info } } = store.getState(),
        checkList = ['/personal', '/store', '/update'];
    return !info && checkList.includes(path);
}

const Element = function Element(props) {
    //  接收{...item}中传过来的值,这些值其实都是路由表中对象的键值对信息(routes.js中配置的键值对信息),component是要作为组件的,所以需要重命名成首字母大写
    let { component: Component, meta, path } = props;
    //  调用函数,判断是否需要进行登录态校验,同时控制渲染的是组件还是 loading 效果
    let isShow = !isCheckLogin(path);
    //  用来更新函数组件
    let [_, setRandom] = useState(0);
    // 登录态校验 每次状态改变都需要判断是否需要登录态校验,否则只会在初始化时进行登录态校验
    useEffect(() => {
        if (isShow) return;
        // 如果info不存在,跳转的地址是三个中的一个,从服务器异步获取登录者信息,info存放的是登陆者的信息
        // 在此处用立即执行函数包 async,如果将 async 写在函数 function 处,将会返回一个 Promise 对象,该组件是用作渲染其他组件的,返回值必须为 jsx 不能为Promise
        (async () => {
            //  调用redux中的函数,从给定的接口中获取登录信息
            let infoAction = await actions.base.queryUserInfoAsync();
            let info = infoAction.info;
            if (!info) {
                // 获取后还是不存在,那么就是没有登陆,进行提示登录
                Toast.show({
                    icon: 'fail',
                    content: '请先登录'
                })
                // 跳转到登录页,replace 是在登陆组件时需要用到的,其实就是登录界面的返回前一个界面的功能问题
                navigate({
                    pathname: '/login',
                    search: `?to=${path}`
                }, { replace: true })
                return;
            }
            // 获取了信息,说明是登陆状态,派发任务把信息存储到容器中
            store.dispatch(infoAction);
            // 每次获取完登录信息后都需要更新组件,更新info,从而正确完成登录态校验
            setRandom(+new Date());
        })();
    });
    //修改页面的TITLE
    let { title = "知乎日报-WebApp" } = meta || {};
    document.title = title;
    //获取路由信息,基于属性传递给组件
    const navigate = useNavigate(),
        location = useLocation(),
        params = useParams(),
        [usp] = useSearchParams();
    return (
        <>
            {
                isShow ? <Component
                    navigate={navigate}
                    location={location}
                    params={params}
                    usp={usp} /> :
                    <Mask visible={true}>
                        <DotLoading color="white" />
                    </Mask>
            }
        </>
    )
};

最后,路由配置完需要在 App 中包裹上相应的插件,例如:BrowserRouter,KeepAliveProvider

import React from "react";
import { BrowserRouter } from 'react-router-dom';
import RouterView from "./router";
import { KeepAliveProvider } from "keepalive-react-component/lib";
const App = function App() {
    return (
        <BrowserRouter>
            <KeepAliveProvider>
                <RouterView />
            </KeepAliveProvider >
        </BrowserRouter>
    )
}
export default App;

标签:登录,校验,path,组件,import,路由,路由表
From: https://www.cnblogs.com/wj-goodgoodstudy/p/17310849.html

相关文章

  • BISS-C 8通道采集renishaw传感器及其CRC校验
    背景BISS-C是常见的位置编码器传输协议,相对于传统的协议,支持更快的传输速度,电器接口为电压差分RS422或者485,抗干扰能力较强,在精密位置传输中应用广泛。下述信息源自雷尼绍典型的请求循环进程如下:当空闲时,主接口使MA线保持高电平。光栅通过使SLO线保持高电平显示它已准备......
  • 日志相关、全量字段校验
    一、日志简介日志也叫log,通常对应的xxx.log的日志文件。文件的作用是记录系统运行过程中,产生的信息。搜集日志的作用:查看系统运行是否正常。分析、定位bug 二、日志级别logging.DEBUG:调试级别【高】,打印非常详细的日志信息。适用于代码调......
  • Django自带的Admin后台中如何获取当前登录用户
    需求背景在使用Django快速开发一个IT电脑、显示器资产管理小系统的时候,遇到一个问题是,当变更资产设备(新增、修改、删除)的时候,能记录是谁在什么时间进行的变更。确认的是肯定是登录状态,但是在使用Django的signal中获取不到当前登录的用户问题演示1、定义资产设备模型和 自定义日志......
  • 用Abp实现两步验证(Two-Factor Authentication,2FA)登录(二):Vue网页端开发
    @目录发送验证码登录退出登录界面控件获取用户信息功能项目地址前端代码的框架采用vue.js+elementUI这套较为简单的方式实现,以及typescript语法更方便阅读。首先添加全局对象:loginForm:登录表单对象twoFactorData:两步验证数据,showTwoFactorSuccess:是否显示两步验证成......
  • Javaweb-登录界面-filter配合案例-2023-04-11
    1、新建login.jsp登录界面响应的路径<%@pagecontentType="text/html;charset=UTF-8"language="java"%><html><head><title>Login</title></head><body><h1>登录界面</h1><hr><form......
  • vmware esxi 用户名(账号)密码明明正确,网页却无法登录管理后台的解决办法大全
    相信使用过VmwareEsxi虚拟系统的网友们可能都偶尔遇到过,明明vmwareesxi用户名密码是正确的,管理网页却无法登录管理的现象。一、账号密码正常但无法登录现象:隔了一段时间没有登录,用服务器名或IP再登录Vmware的网页管理后台,输入正确的管理员用户名及密码,之前登录都非常正常......
  • 使用python库解决登录的验证码识别-图片验证码
    前言:在UI自动化测试和爬虫测试中,验证码是个比较头疼的问题,包括:图片验证码,滑块验证码,等一些常见的验证码场景。识别验证码的python库有很多,用起来也并不简单,这里推荐一个简单实用的识别验证码的库ddddocr(带带弟弟ocr)库。今天先用一个图片验证码示例来演示下:准备:1.安装库d......
  • 用Java写一段中国身份证的正则表达式,要求验证身份证中的日期,且大于1900年,以及校验码验
    以下是一个Java正则表达式,可用于验证中国身份证中的日期,并要求日期在1900年及之后:Stringregex="(?:(?:19[0-9]\\d)|(?:[2-9]\\d{3}))(?:0[1-9]|1[012])(?:0[1-9]|[12]\\d|3[01])\\d{3}[\\dXx]";这个正则表达式的含义如下:(?:(?:19[0-9]\\d)|(?:[2-9]\\d{3})):匹配1900年......
  • mysql数据库的登录脚本
    ######################## ku脚本:可以使用以下ku脚本,它可以根据提供的参数登录到MySQL数据库:#!/bin/bash#Checkforcorrectnumberofargumentsif[$#-lt1];thenecho"Usage:$0<ip>[<port>][<mysqloptions>]"exit1fi#SettheIPaddress......
  • element-ui校验表单只能输入数字
    element-ui校验表单只能输入数字原文链接:https://blog.csdn.net/q879936814/article/details/126788782接到需求,让表单中只能输入数字,使用v-model的.number可以实现,但是不能以0为开头;又试了rule加type=number校验,输入数组一直报输入的不是数字。。最后使用了onkeyup方法<el......