React Router6.x路由表封裝的兩種寫法
一. 標(biāo)簽形式
src 文件夾下創(chuàng)建一個 routers 文件夾,用于存放路由表
src/routers 文件夾下創(chuàng)建一個 index.js 文件,用于設(shè)置路由表
import { BrowserRouter, Routes, Route, Navigate } from "react-router-dom";
import App from "../App";
import { lazy, Suspense } from "react";
// 使用路由懶加載(lazy)
const Home = lazy(() => import("@/pages/Home"));
const About = lazy(() => import("@/pages/About"));
const baseRouter = () => (
{/* BrowserRouter 設(shè)置路由模式 */}
<BrowserRouter>
{/* fallback 屬性值可以時組件 */}
<Suspense fallback={<div>loading...</div>}>
<Routes>
<Route path="/" element={<App />}>
<Route path="/" element={<Navigate to="/home" />}></Route>
<Route path="/home" element={<Home />}></Route>
<Route path="/about" element={<About />}></Route>
</Route>
</Routes>
</Suspense>
</BrowserRouter>
);
export default baseRouter;
src/App.js 文件中設(shè)置路由鏈接、組件展示位置
import './App.css'
import { Outlet, Link } from "react-router-dom";
function App() {
return (
<div className="App">
{/* 路由鏈接 */}
<Link to="home">home頁面</Link>
<Link to="about">about頁面</Link>
<br />
<br />
{/* 組件占位,在該位置渲染組件 */}
<Outlet />
</div>
);
}
export default App;
src/index.js 文件中使用路由表,替換之前的 <App/>
import React from "react";
import ReactDOM from "react-dom/client";
import reportWebVitals from "./reportWebVitals";
import Router from "./routers";
const root = ReactDOM.createRoot(document.getElementById("root"));
root.render(
<React.StrictMode>
{/* 使用路由表 */}
<Router />
</React.StrictMode>
);
reportWebVitals();
二. 對象形式
src 文件夾下創(chuàng)建一個 routers 文件夾,用于存放路由表
src/routers 文件夾下創(chuàng)建一個 index.js 文件,用于設(shè)置路由表
import { Navigate } from "react-router-dom";
import { lazy } from "react";
// 使用路由懶加載(lazy)
const Home = lazy(() => import("@/pages/Home"));
const About = lazy(() => import("@/pages/About"));
const routers = [
{
path: "/",
element: <Navigate to="/home" />,
},
{
path: "/home",
element: <Home />,
},
{
path: "/about",
element: <About />,
},
];
export default routers;
src/App.js 文件中獲取路由組件,設(shè)置組件展示位置
import "reset-css";
import "./App.scss";
import { useRoutes, Link } from "react-router-dom";
import routers from "./routers";
import { Suspense } from "react";
function App() {
// 使用 useRoutes 獲取路由組件
const element = useRoutes(routers);
return (
<div className="App">
{/* 路由鏈接 */}
<Link to="home">home頁面</Link>
<Link to="about">about頁面</Link>
<br />
<br />
{/* 路由組件展示位置,fallback 屬性值可以時組件 */}
<Suspense fallback={<div>loading...</div>}>{element}</Suspense>
</div>
);
}
export default App;
src/index.js 文件中使用BrowserRouter標(biāo)簽包裹 <App/>標(biāo)簽,設(shè)置路由模式
import React from "react";
import ReactDOM from "react-dom/client";
import App from "./App";
import reportWebVitals from "./reportWebVitals";
import { BrowserRouter } from "react-router-dom";
const root = ReactDOM.createRoot(document.getElementById("root"));
root.render(
// BrowserRouter 設(shè)置路由模式
<BrowserRouter>
<React.StrictMode>
<App />
</React.StrictMode>
</BrowserRouter>
);
reportWebVitals();
三. 實現(xiàn)一個經(jīng)典的左目錄右內(nèi)容布局結(jié)構(gòu)(使用對象路由方式)
src 文件夾下創(chuàng)建一個 routers 文件夾,用于存放路由表
src/routers 文件夾下創(chuàng)建一個 index.js 文件,用于設(shè)置路由表
import { Navigate } from "react-router-dom";
import { lazy } from "react";
// 使用路由懶加載(lazy)
const Home = lazy(() => import("@/pages/Home"));
const Page1 = lazy(() => import("@/pages/Page1"));
const Page2 = lazy(() => import("@/pages/Page2"));
const Page3 = lazy(() => import("@/pages/Page3"));
const routers = [
/**
* 父子路由嵌套使用
* 父路由路徑為 '/'
* children 屬性對應(yīng)父路由下的子路由
*/
{
path: "/",
element: <Home />,
children: [
// 根路徑時,使用 Navigate 路由重定向至 page1 頁面
{
path: "",
element: <Navigate to="/page1" />,
},
{
path: "page1",
element: <Page1 />,
},
{
path: "page2",
element: <Page2 />,
},
{
path: "page3",
element: <Page3 />,
},
],
},
];
export default routers;
src/App.js 文件中獲取路由組件,設(shè)置組件展示位置
import "./App.css";
import { Suspense } from "react";
import { useRoutes } from "react-router-dom";
import routers from "./routers";
function App() {
// 使用 useRoutes 獲取路由組件
const element = useRoutes(routers);
return (
<div className="App">
{/*
路由組件展示位置 {element}
Suspense:加載指示器(loading indicator),以防其組件樹中的某些子組件尚未具備渲染條件
fallback 屬性值可以是組件
*/}
<Suspense fallback={<div>loading...</div>}>{element}</Suspense>
</div>
);
}
export default App;
src/index.js 文件中使用BrowserRouter標(biāo)簽包裹 <App/>標(biāo)簽,設(shè)置路由模式
import React from "react";
import ReactDOM from "react-dom/client";
import App from "./App";
import reportWebVitals from "./reportWebVitals";
import { BrowserRouter } from "react-router-dom";
const root = ReactDOM.createRoot(document.getElementById("root"));
root.render(
// BrowserRouter 設(shè)置路由模式
<BrowserRouter>
<React.StrictMode>
<App />
</React.StrictMode>
</BrowserRouter>
);
reportWebVitals();
src/routers/index.js 中對應(yīng)的組件

Home組件:
使用了 ant4 進行布局
import {
DesktopOutlined,
PieChartOutlined,
UserOutlined,
} from "@ant-design/icons";
import { Layout, Menu } from "antd";
import React, { useState, Suspense } from "react";
import { Outlet, useNavigate } from "react-router-dom";
const App = () => {
const { Content, Sider } = Layout;
function getItem(label, key, icon, children) {
return {
key,
icon,
children,
label,
};
}
const items = [
getItem("目錄一", "/page1", <PieChartOutlined />),
getItem("目錄二", "/page2", <DesktopOutlined />),
getItem("目錄三", "/page3", <UserOutlined />),
];
const [collapsed, setCollapsed] = useState(false);
let navigate = useNavigate();
// 點擊跳轉(zhuǎn)至對應(yīng)的路由
const clickMenu = (evt) => {
navigate(evt.key);
};
return (
<Layout
style={{
minHeight: "100vh",
}}
>
<Sider
collapsible
collapsed={collapsed}
onCollapse={(value) => setCollapsed(value)}
>
<div className="logo" />
<Menu
theme="dark"
defaultSelectedKeys={["1"]}
mode="inline"
items={items}
onClick={clickMenu}
/>
</Sider>
<Layout className="site-layout">
<Content>
{/* 子路由的組件占位,在該位置渲染子組件 */}
<Suspense fallback={<div>loading...</div>}>
<Outlet />
</Suspense>
</Content>
</Layout>
</Layout>
);
};
export default App;
Page1組件:
import React from "react";
export default function Page1() {
return <div>Page1</div>;
}
Page2組件:
import React from "react";
export default function Page2() {
return <div>Page2</div>;
}
Page3組件:
import React from "react";
export default function Page3() {
return <div>Page3</div>;
}
實現(xiàn)效果:

到此這篇關(guān)于React Router6.x路由表封裝的兩種寫法的文章就介紹到這了,更多相關(guān)React Router6.x路由表封裝內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
在react項目中使用antd的form組件,動態(tài)設(shè)置input框的值
這篇文章主要介紹了在react項目中使用antd的form組件,動態(tài)設(shè)置input框的值,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-10-10
react?路由權(quán)限動態(tài)菜單方案配置react-router-auth-plus
這篇文章主要為大家介紹了react路由權(quán)限動態(tài)菜單方案react-router-auth-plus傻瓜式配置詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-08-08
在 React 中使用 Redux 解決的問題小結(jié)
在 React 中組件通信的數(shù)據(jù)流是單向的,頂層組件可以通過 props 屬性向下層組件傳遞數(shù)據(jù),而下層組件不能直接向上層組件傳遞數(shù)據(jù),這篇文章主要介紹了使用react+redux實現(xiàn)彈出框案例,需要的朋友可以參考下2022-10-10

