React Router6.x路由表封裝的兩種寫法
一. 標(biāo)簽形式
src 文件夾下創(chuàng)建一個(gè) routers
文件夾,用于存放路由表
src/routers 文件夾下創(chuàng)建一個(gè) 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 屬性值可以時(shí)組件 */} <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頁(yè)面</Link> <Link to="about">about頁(yè)面</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();
二. 對(duì)象形式
src 文件夾下創(chuàng)建一個(gè) routers
文件夾,用于存放路由表
src/routers 文件夾下創(chuàng)建一個(gè) 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頁(yè)面</Link> <Link to="about">about頁(yè)面</Link> <br /> <br /> {/* 路由組件展示位置,fallback 屬性值可以時(shí)組件 */} <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();
三. 實(shí)現(xiàn)一個(gè)經(jīng)典的左目錄右內(nèi)容布局結(jié)構(gòu)(使用對(duì)象路由方式)
src 文件夾下創(chuàng)建一個(gè) routers
文件夾,用于存放路由表
src/routers 文件夾下創(chuàng)建一個(gè) 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 屬性對(duì)應(yīng)父路由下的子路由 */ { path: "/", element: <Home />, children: [ // 根路徑時(shí),使用 Navigate 路由重定向至 page1 頁(yè)面 { 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),以防其組件樹(shù)中的某些子組件尚未具備渲染條件 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 中對(duì)應(yīng)的組件
Home組件:
使用了 ant4 進(jìn)行布局
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(); // 點(diǎn)擊跳轉(zhuǎn)至對(duì)應(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>; }
實(shí)現(xiàn)效果:
到此這篇關(guān)于React Router6.x路由表封裝的兩種寫法的文章就介紹到這了,更多相關(guān)React Router6.x路由表封裝內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
React類組件中super()和super(props)的區(qū)別詳解
這篇文章給大家詳細(xì)介紹了React類組件中super()和super(props)有什么區(qū)別,文中通過(guò)代碼示例給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2024-01-0130行代碼實(shí)現(xiàn)React雙向綁定hook的示例代碼
本文主要介紹了30行代碼實(shí)現(xiàn)React雙向綁定hook的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-04-04React Hook useState useEffect componentD
這篇文章主要介紹了React Hook useState useEffect componentDidMount componentDidUpdate componentWillUnmount問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-03-03React中useEffect原理的代碼簡(jiǎn)單實(shí)現(xiàn)詳解
React的useEffect鉤子是React函數(shù)組件中處理副作用,本文將通過(guò)一個(gè)簡(jiǎn)單的例子解釋如何用代碼實(shí)現(xiàn)useEffect的基本原理,感興趣的小伙伴可以了解下2023-12-12react中useEffect函數(shù)的詳細(xì)用法(最新推薦)
useEffect是React中的一個(gè)Hook,用于在函數(shù)組件中處理副作用(如數(shù)據(jù)獲取、訂閱、手動(dòng)更改 DOM 等),useEffect屬于組件的生命周期方法,下面通過(guò)本文給大家分享react中useEffect函數(shù)的詳細(xì)用法,感興趣的朋友跟隨小編一起看看吧2024-06-06React Native 集成 ArcGIS 地圖的詳細(xì)過(guò)程
ArcGIS官方提供了 JavaScript SDK,也提供了 ArcGIS-Runtime-SDK-iOS,但是并沒(méi)有提供 React Native的版本,所以這里使用了 react-native-arcgis-mapview 庫(kù),本文給大家介紹React Native 集成 ArcGIS 地圖的詳細(xì)過(guò)程,感興趣的朋友跟隨小編一起看看吧2024-06-06React使用Electron開(kāi)發(fā)桌面端的詳細(xì)流程步驟
React是一個(gè)流行的JavaScript庫(kù),用于構(gòu)建Web應(yīng)用程序,結(jié)合Electron框架,可以輕松地將React應(yīng)用程序打包為桌面應(yīng)用程序,本文詳細(xì)介紹了使用React和Electron開(kāi)發(fā)桌面應(yīng)用程序的步驟,需要的朋友可以參考下2023-06-06詳解react使用react-bootstrap當(dāng)輪子造車
本篇文章主要介紹了詳解react使用react-bootstrap當(dāng)輪子造車,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2017-08-08