reactRouterV6 history模式的使用

135 阅读1分钟

reactRouterV6 history模式的使用

这是对前一个文章一个 WebPack5+Typescript5+React18的前端工程的补充,在这个工程里用了react-router-v6history模式,并且加上路由守卫

安装

npm install --save react-router-dom@6
yarn add --save react-router-dom@6
pnpm add --save react-router-dom@6

使用

根页面包裹所有

// index.tsx
import { createRoot } from 'react-dom/client';
import { BrowserRouter } from 'react-router-dom';
import App from './App';
import './index.scss';
// 根路由需要被包裹
const root = createRoot(document.getElementById('root') as HTMLElement);
root.render(
    <BrowserRouter>
        <App />
    </BrowserRouter>,
);

App页面调用路由配置

// App.tsx
import { useRoutes } from 'react-router-dom';
import './App.scss';
//直接使用配置文件的路由
import routesWithGuard from 'src/router/routesConfig';
const App = () => {
    const routes = routesWithGuard();
    return <div className="App bg-gray-700 h-full">{useRoutes(routes)}</div>;
};
export default App;

配置文件

//routesConfig.tsx
import { Navigate } from 'react-router-dom';
import NotFind from 'src/pages/404';
import Home from 'src/pages/Layout';
import PageTemplate from 'src/pages/Layout/PageTemplate';
import { ExtendedRouteObject } from './type';
/* ---HomeEnd---*/
export default function routesWithGuard(): ExtendedRouteObject[] {
    //这里可以改成自己的校验逻辑
    const isLogin = !!localStorage.getItem('user_token');
    return [
        {
        path: '/home',
        element: isLogin ? <Home /> : <Navigate to="/user/login" />,
        children: [
                {
                    path: 'PageTemplate',
                    title: '页面模板',
                    element: <PageTemplate />,
                },
                {
                    path: '',
                    element: <Navigate to="PageTemplate" replace />,
                },
            ],
        },
        {
            path: '*',
            element: <NotFind />,
        },
    ];
}

路由导航

组件式

import * as React from "react";
import { Link } from "react-router-dom";
function UsersIndexPage({ users }) {
  return (
    <div>
      <h1>Users</h1>
      <ul>
        {users.map((user) => (
          <li key={user.id}>
            <Link to='user'>{user.name}</Link>
          </li>
        ))}
      </ul>
    </div>
  );
}

函数式组件中使用

import { NavigateFunction, Outlet, useNavigate } from 'react-router-dom';
function Layout() {
    const navigate: NavigateFunction = useNavigate();
    const loginOut = () => {
        localStorage.clear();
        navigate('/user/login');// 重定向到对应的路由
    };
    return (
        <div className="layout-container h-full">
            <button type="button" onClick={() => loginOut()}>
                退出
            </button>
            <Outlet />
        </div>
    );
}
export default Layout;