react 路由配置:從入門到精通

前言

在現代Web開發中,React憑借其高效的組件化開發模式和虛擬DOM技術,已成為構建用戶界面的首選庫之一。然而,僅掌握React的核心概念并不足以應對復雜的單頁應用(SPA)開發需求。路由管理作為連接各個頁面、實現視圖切換的關鍵環節,對于提供流暢的用戶體驗至關重要。無論是導航到不同的頁面,還是根據URL動態展示內容,合理設計與實現路由都是每個React開發者必須面對的課題。

本文旨在為讀者提供一個全面而深入的指南,幫助你從基礎到高級全面掌握React路由的應用。無論你是剛剛接觸React的新手,還是希望進一步提升技能的有經驗開發者,“React 路由:一篇就夠了”都將為你揭開React路由管理的神秘面紗。我們將從最基礎的路由配置開始,逐步深入探討如何利用react-router-dom庫進行頁面導航、參數傳遞、嵌套路由設置,乃至基于權限控制的私有路由實現等高級話題。此外,我們還將介紹懶加載等優化策略,以提高應用性能。通過閱讀這篇文章,你將能夠自信地在自己的項目中實現高效且靈活的路由系統,讓開發過程更加得心應手。讓我們一起開啟這段探索React路由之旅吧!

安裝 react-router-dom?

yarn add react-router-dom
或者

npm install?react-router-dom

路由引入

?在App.tsx里引入

import './App.css'
import AppRoutes from './routes/RouterConfig'const App: React.FC = () => {return (<div className="App"><AppRoutes /></div>)
}export default App

路由配置

下面的是路由的配置, 這里使用的是基于history模式的BrowserRouter,當然也可以使用HashRouter包裹(哈希路由),這里還設置了如果進入沒有配置的路由頁面,則會顯示404頁面。

這里也配置了二級路由,同時也加了路由守衛

import { FC } from 'react'
import { BrowserRouter, Route, Routes, Outlet } from 'react-router-dom'
import Login from '@/pages/LoginPage'
import Home from '@/pages/Home'
import About from '@/pages/About'
import NotFoundPage from '@/pages/NotFoundPage'
import PrivateRoute from './PrivateRoute'export const routes = [{ path: '/login', element: <Login />, isPrivate: false },{ path: '/', element: <Home />, isPrivate: true, children: [{ path: 'about', element: <About />, isPrivate: true }] },{ path: '*', element: <NotFoundPage />, isPrivate: false },
]const AppRoutes: FC = () => {// 遞歸渲染路由const renderRoutes = (routes: any) => {return routes.map((route: any) => {let element = route.isPrivate ? <PrivateRoute>{route.element}</PrivateRoute> : route.elementif (route.children) {element = (<>{element}<Outlet /></>)}return (<Route key={route.path} path={route.path} element={element}>{route.children && renderRoutes(route.children)}</Route>)})}return (<BrowserRouter><Routes>{renderRoutes(routes)}</Routes></BrowserRouter>)
}export default AppRoutes

路由守衛?

React的路由守衛(Route Guards)是一種用于控制頁面訪問的機制。它允許你在用戶嘗試訪問某個頁面之前,執行一些邏輯,如驗證用戶身份、檢查頁面權限等。

import { Navigate } from 'react-router-dom'
import { useSelector } from 'react-redux'
import { RootState } from '@/store/index'interface PrivateRouteProps {children: JSX.Element
}// 定義一個私有路由組件
const PrivateRoute: React.FC<PrivateRouteProps> = ({ children }) => {// 從Redux中獲取用戶是否登錄的狀態const isLoggedIn = useSelector((state: RootState) => state.authReducer.isLoggedIn)// 如果用戶已登錄,則渲染子組件,否則重定向到登錄頁面return isLoggedIn ? children : <Navigate to="/login" />
}export default PrivateRoute

路由懶加載

使用懶加載lazy和當網絡異常時的回調組件方式Suspense?

下面是完整的路由配置代碼

import { FC, lazy, Suspense } from 'react'
import { BrowserRouter, Route, Routes, Outlet } from 'react-router-dom'
import PrivateRoute from './PrivateRoute'// 使用 lazy 函數進行懶加載
const Login = lazy(() => import('@/pages/LoginPage'))
const Home = lazy(() => import('@/pages/Home'))
const About = lazy(() => import('@/pages/About'))
const NotFoundPage = lazy(() => import('@/pages/NotFoundPage'))export const routes = [{ path: '/login', element: <Login />, isPrivate: false },{ path: '/', element: <Home />, isPrivate: true, children: [{ path: 'about', element: <About />, isPrivate: true }] },{ path: '*', element: <NotFoundPage />, isPrivate: false },
]const AppRoutes: FC = () => {const renderRoutes = (routes: any) => {return routes.map((route: any) => {let element = route.isPrivate ? <PrivateRoute>{route.element}</PrivateRoute> : route.elementif (route.children) {element = (<>{element}<Outlet /></>)}return (<Route key={route.path} path={route.path} element={<Suspense fallback={<div>加載中……</div>}>{element}</Suspense>}>{route.children && renderRoutes(route.children)}</Route>)})}return (<BrowserRouter><Suspense fallback={<div>Loading...</div>}><Routes>{renderRoutes(routes)}</Routes></Suspense></BrowserRouter>)
}export default AppRoutes

react-router-dom?基本原理

在React應用中,路由跳轉的原理主要依賴于react-router-dom庫所提供的機制。該庫基于HTML5 History API(包括pushStatereplaceState等方法)和哈希(hash)模式來管理URL的變化,并通過監聽URL變化來動態加載不同的組件,從而實現頁面的無刷新切換。以下是React路由跳轉的基本原理及其工作流程:

基本原理
  1. History API: react-router-dom使用了HTML5的History API來操作瀏覽器的歷史記錄棧。這意味著它可以添加或修改歷史記錄條目,使得用戶可以通過前進或后退按鈕導航,而不會觸發整個頁面的重新加載。具體來說,當進行路由跳轉時,它會調用history.push()history.replace()等方法來改變當前的URL路徑。

  2. 監聽URL變化: 當用戶執行某些動作(如點擊鏈接或瀏覽器的前進/后退按鈕)導致URL發生變化時,react-router-dom會監聽到這些變化。這通常通過window對象上的popstate事件來實現。一旦檢測到URL變化,它就會根據新的URL路徑來決定應該渲染哪個組件。

  3. 匹配路由與渲染組件: 根據配置好的路由表,react-router-dom會嘗試將當前的URL路徑與定義的路由進行匹配。如果找到匹配項,則會渲染相應的React組件;如果沒有匹配項,則可能會顯示404頁面或其他默認內容

工作流程
  • 初始化: 在應用啟動時,react-router-dom會首先讀取配置好的路由表,并根據初始URL渲染對應的組件。

  • 導航跳轉: 當需要從一個頁面跳轉到另一個頁面時,可以使用<Link>組件或者編程方式(如useNavigate鉤子)來發起跳轉。這會導致URL發生變化,但不會重新加載整個頁面。

  • 響應URL變化: URL更新后,react-router-dom會監聽到這一變化,并查找與新URL相匹配的路由規則。如果找到了匹配項,就渲染對應的組件;否則,可能展示一個錯誤頁面。

  • 狀態管理: 除了基本的路由跳轉外,react-router-dom還允許你在跳轉過程中傳遞狀態信息,比如通過查詢參數或者路由狀態等。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/895176.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/895176.shtml
英文地址,請注明出處:http://en.pswp.cn/news/895176.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

CPLD實現SPI通信

在 CPLD 中編寫 SPI 程序時,需根據具體需求(主/從設備、時鐘極性、數據位寬等)設計邏輯。以下提供一個 SPI 主控制器的 Verilog 實現示例,支持 模式 0(CPOL=0, CPHA=0),適用于控制外設(如 ADC、DAC、存儲器等)。 SPI 主控制器模塊設計(Verilog) 模塊功能 支持 8/16…

MapReduce簡單應用(三)——高級WordCount

目錄 1. 高級WordCount1.1 IntWritable降序排列1.2 輸入輸出格式1.3 處理流程 2. 代碼和結果2.1 pom.xml中依賴配置2.2 工具類util2.3 高級WordCount2.4 結果 參考 本文引用的Apache Hadoop源代碼基于Apache許可證 2.0&#xff0c;詳情請參閱 Apache許可證2.0。 1. 高級WordCo…

智慧機房解決方案(文末聯系,領取整套資料,可做論文)

智慧機房解決方案-軟件部分 一、方案概述 本智慧機房解決方案旨在通過硬件設備與軟件系統的深度整合&#xff0c;實現機房的智能化管理與服務&#xff0c;提升機房管理人員的工作效率&#xff0c;優化機房運營效率&#xff0c;確保機房設備的安全穩定運行。軟件部分包括機房管…

(五)Spring Boot學習——spring security +jwt使用(前后端分離模式)

一定要熟悉spring security原理和jwt無狀態原理&#xff0c;理解了才知道代碼作用。 在 Spring Security JWT 認證流程中&#xff0c;通常的做法是&#xff1a; 用戶提交用戶名和密碼Spring Security 認證管理器 (AuthenticationManager) 進行認證如果認證成功&#xff0c;生…

清華DeepSeek手冊:從入門到精通(網頁版便于閱讀)

目錄 一、產品概述二、清華DeepSeek從入門到精通三、PDF文件路徑 一、產品概述 DeepSeek是國產領先的人工智能技術平臺&#xff0c;提供從數據分析到大型語言模型的全棧解決方案。其核心產品包括網頁端數據分析工具[1] 、視覺語言模型(DeepSeek-VL)[2] 和670億參數大型語言模型…

阿里云百煉初探DeepSeek模型調用

阿里云百煉初探DeepSeek模型調用 阿里云百煉為什么選擇百煉開始使用百煉方式一&#xff1a;文本對話方式二&#xff1a;文本調試方式三&#xff1a;API調用 DeepSeek調用1、搜索模型2、查看API調用3、開始調用安裝依賴查看API Key運行以下代碼 4、流式輸出 總結 阿里云百煉 阿…

【網絡安全】服務器安裝Docker及拉取鏡像教程

文章目錄 1. 安裝 Docker2. 拉取鏡像3. 運行 Ubuntu 容器4. 執行相關操作5. 退出并停止容器1. 安裝 Docker # 更新軟件包索引 sudo apt update# 安裝必要的依賴 sudo apt install -y ca-certificates curl gnupg

AI刷題-子數組和的最大值問題

目錄 問題描述 輸入格式 輸出格式 輸入樣例 輸出樣例 說明 數據范圍 解題思路&#xff1a; 問題理解 數據結構選擇 算法步驟 具體步驟 代碼實現&#xff1a; 1.特判&#xff1a; 不需要刪除元素的時候 2.在前面的判斷結束后&#xff1a;k1&#xff0c;&#xff…

pytest.fixture

pytest.fixture 是 pytest 測試框架中的一個非常強大的功能,它允許你在測試函數運行前后執行一些設置或清理代碼。以下是關于 pytest.fixture 的詳細介紹: 一、定義與用途 pytest.fixture 是一個裝飾器,用于標記一個函數為 fixture。Fixture 函數中的代碼可以在測試函數運…

Swift的方法派發機制

1. 靜態派發&#xff08;Static Dispatch&#xff09; 靜態派發在編譯時確定方法的具體實現&#xff0c;調用時直接跳轉到該實現。靜態派發的優點是性能高&#xff0c;因為不需要運行時查找方法實現。 適用場景&#xff1a; 值類型&#xff08;Struct 和 Enum&#xff09;&am…

C++并發編程指南 09(共享數據)

文章目錄 第3章 共享數據本章主要內容共享數據的問題使用互斥保護數據保護數據的替代方案 3.1 共享數據的問題共享數據的核心問題不變量的重要性示例&#xff1a;刪除雙鏈表中的節點多線程環境中的問題條件競爭的后果總結3.1.1 條件競爭3.1.2 避免惡性條件競爭 3.2 使用互斥量3…

ZooKeeper 技術全解:概念、功能、文件系統與主從同步

引言 隨著分布式系統變得越來越復雜&#xff0c;對協調服務的需求也在不斷增長。ZooKeeper 作為一個由 Apache 維護的開源分布式協調服務框架&#xff0c;廣泛用于 Hadoop 生態系統和其他需要協調的分布式環境中。這一系統旨在解決分布式應用中常見的挑戰&#xff0c;如配置管…

設計方案主要做哪些事情?

目錄 1. 需求分析 2. 系統架構設計 3. 數據庫設計 4. 接口設計 5. 緩存設計 6. 安全設計 7. 性能優化 8. 高可用與容災 9. 監控與日志 10. 測試方案 11. 部署方案 12. 文檔編寫 13. 風險評估 14. 項目管理 總結 設計方案是項目開發的關鍵步驟,確保項目按計劃進…

【語法】C++的內存管理 模板

內存管理&#xff1a; 在C語言中&#xff0c;動態開辟空間可以用malloc&#xff0c;calloc&#xff0c;realloc這三個函數&#xff0c;下面先來復習一下這三者的區別 malloc和calloc都是用來開辟新空間&#xff0c;calloc在malloc的基礎上還會初始化該空間為0&#xff0c;用法…

30~32.ppt

目錄 30.導游小姚-介紹首都北京? 題目? 解析 31.小張-旅游產品推廣文章 題目 解析 32.小李-水的知識? 題目? 解析 30.導游小姚-介紹首都北京? 題目 解析 新建幻燈片-從大綱-重置-檢查設計→主題對話框→瀏覽主題&#xff1a;考生文件夾&#xff08;注意&#x…

深度學習-交易預測

下面為你詳細介紹如何使用Python結合深度學習庫TensorFlow和Keras來構建一個簡單的交易預測模型。在這個示例中&#xff0c;我們以股票價格預測為例&#xff0c;假設我們要根據過去一段時間的股票價格數據來預測未來的價格走勢。 步驟分析 數據準備&#xff1a;獲取股票價格數…

C++ STL Map 學習學案(提高版)

C++ STL Map 學案(初中生版) 一、學習目標 深入理解 STL 中 map 容器的概念、特點和用途。熟練掌握 map 容器的基本操作,如插入、查找、刪除和遍歷元素。能夠運用 map 容器解決實際編程問題,提升邏輯思維和編程實踐能力。二、知識講解 引入 在日常生活中,我們常常會遇到…

uniapp實現人臉識別(不使用三方插件)

uniapp實現人臉識別 內容簡介功能實現上傳身份證進行人臉比對 遇到的問題 內容簡介 1.拍攝/相冊將身份證照片上傳到接口進行圖片解析 2.使用live-pusher組件拍攝人臉照片&#xff0c;上傳接口與身份證人臉進行比對 功能實現 上傳身份證 先看下效果 點擊按鈕調用chooseImage…

Evaluating Very Long-Term Conversational Memory of LLM Agents 論文

Abstract : 長期開放域對話的現有作品著重于評估不超過五個聊天會議的上下文中的模型響應。盡管LongContext大語言模型&#xff08;LLM&#xff09;和檢索增強發電&#xff08;RAG&#xff09;技術的進步&#xff0c;但在長期對話中的功效仍未得到探索。為了解決這一研究差距&a…

相對收益-固定收益組合歸因-Campisi模型

固定收益組合歸因-Campisi模型 1 Campisi模型11.1 Campisi歸因框架1.2 Campisi模型絕對收益分解1.2.1 票息收益1. 2.2 收斂收益1. 2.3 騎乘收益1. 2.4 平移收益1. 2.5 扭曲收益1. 2.6 利差收益1. 2.7 殘差收益 1.3 Campisi模型超額收益分解 2 Campisi模型22.1 分解框架2.2 模型…