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

新建router.js文件

javascript 复制代码
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文件

javascript 复制代码
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文件

javascript 复制代码
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文件

javascript 复制代码
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;
相关推荐
杨利杰YJlio14 小时前
KB5121003更新详解:安全启动证书、AI组件、资源管理器与安装验证
前端·javascript·后端
紫菜猫一只14 小时前
Vue 3 与 React 常用写法对比
前端
jinggongszh14 小时前
使用AI协同开发产品条码规则功能——从“理解方案、原型、接口文档”到“落地真实前端代码”
前端·人工智能·mes系统·mes工程架构
渔夫正在掘金14 小时前
Cordis 中文教程:渐进式构建插件化应用
前端·node.js·ai编程
打呵欠的猫15 小时前
前端团队 3 个月 AI 实践复盘:哪些场景 ROI 最高,哪些是伪需求
前端·ai编程
gyx_这个杀手不太冷静15 小时前
高级前端开发职业规划(2026—2035)
前端·面试·agent
程序员黑豆15 小时前
Java中的null与NullPointerException完全指南:安全处理、实战排查与面试题
java·前端·ai编程
编程快车15 小时前
用 Phaser 4 造一个空间解谜游戏:纯函数棋盘引擎、透明画布分层与轻量双语
前端·程序员
可视之道16 小时前
前端图形编辑器的多选框架:从单选到框选到 Shift 连选
前端
3秒一个大16 小时前
JS 数组去重全方案:从基础到通用万能去重函数
前端·javascript