当前位置: 首页 > news >正文

【react】工程项目中的通过自定义Hook进行路由设计以及路由鉴权

新建router.js文件

import { createBrowserRouter,Navigate } from 'react-router-dom';
import Layout from '../components/Layout';
import NoAuthPage from '../components/NoAuthPage';
import Index from '../pages/index';
import Login from '../pages/login';
import Table from '../pages/table';
 
const router = createBrowserRouter([
  {
    path: '/',
    element: <Layout />,
    children: [
      // 添加默认重定向
      {
        path: '', // 空路径匹配根路径
        element: <Navigate to="/index" replace />, // 自动跳转到 /index
      },
      {
        path: 'index',
        element: <Index />,
      },
      {
        path: 'table',
        element: <Table/>,
      },
    ],
  },
  {
    path: '/login',
    element: <Login />,
  },
  {
    path: '/404',
    element: <NoAuthPage />,
  },
]);
 
export default router;

自定义hook,新建useAuth.js文件

import { useNavigate, useLocation } from 'react-router-dom';
import { useEffect } from 'react';
 
// 模拟的鉴权函数
const isAuthenticated = () => {
    console.log('模拟的鉴权函数');
  // 这里可以替换为实际的鉴权逻辑,比如检查 token 或用户状态
  return localStorage.getItem('token') !== null;
};
 
// 自定义 Hook:useAuthRedirect
const useAuthRedirect = () => {
  const navigate = useNavigate();
  const location = useLocation();
 
  useEffect(() => {
    if (!isAuthenticated()) {
      // 如果当前路径是受保护的且用户未认证,则重定向到登录页面
      navigate('/login', { state: { from: location.pathname } });
    }
  }, [navigate, location]);
};
 
export default useAuthRedirect;

App.js文件

import React from 'react'
import { RouterProvider } from 'react-router-dom';
import router from './router';


function App () {
    return <RouterProvider router={router}></RouterProvider>
}

export default App

Layout.jsx文件

import React from 'react';
import { Layout } from 'antd';
import { Outlet } from 'react-router-dom';
import Menus from './Menu';
import useAuthRedirect from '../utils/useAuth';

const { Header, Content, Footer } = Layout;

const LayoutPage = () => {
  useAuthRedirect()
  return (
    <Layout>
      <Header>
        <Menus />
      </Header>
      <Content>
        <Outlet></Outlet>
      </Content>
      <Footer></Footer>
    </Layout>
  );
};
export default LayoutPage;
http://www.dtcms.com/a/82882.html

相关文章:

  • Python Django入门(创建应用程序)
  • Mysql表的简单操作
  • 深度解析学术论文成果评估(Artifact Evaluation):从历史到现状
  • 【React】基于自定义Hook提取公共逻辑
  • MySQL:float,decimal(1)
  • Python学习第二十一天
  • 风暴潮、潮汐潮流模拟:ROMS模型如何精准预测海洋现象?
  • 云盘搭建笔记
  • 《Python实战进阶》No42: 多线程与多进程编程详解(下)
  • 四种事件类型
  • 自适应柔顺性策略:扩散引导控制中学习近似的柔顺
  • Python中的null是什么?
  • 【C++进阶】深入探索类型转换
  • (electron 报错)TypeError: Cannot read property ‘upgrade‘ of undefined
  • Linux驱动开发-①中断②阻塞、非阻塞IO和异步通知
  • VLAN:逻辑隔离冲突网络的详细讲解
  • Android第四次面试(Java基础篇)
  • Unity动画片段丢失(AnimationClip),如何进行重新绑定
  • OpenCV旋转估计(5)图像拼接的一个函数waveCorrect()
  • 【云上CPU玩转AIGC】——腾讯云高性能应用服务HAI已支持DeepSeek-R1模型预装环境和CPU算力
  • 基于Spring Boot的本科生交流培养管理平台的设计与实现(LW+源码+讲解)
  • c++ XML库用法
  • 【机器学习-模型评估】
  • 【人工智能】如何理解transformer中的token?
  • 以高斯(GaussDB) 为例, 在cmd 命令行连接数据,操作数据库,关闭数据库的详细步骤
  • Jenkins 容器化部署 uniapp H5 项目
  • 完整的类在JVM中的生命周期详解
  • 腾讯云HAI1元体验:轻松调用DeepSeek-R1模型搭建网站
  • FRP在远程办公中的实战应用
  • 国家雪亮工程政策护航,互联网监控管理平台铸就安全防线