詳細講一下React中的路由React Router

1. 基本概念

React?Router 是 React 的路由管理庫,用于在 React 應用中實現頁面導航和路由控制。

2. 安裝

npm install react-router-dom

3. 基礎用法

// App.jsx
import { BrowserRouter, Routes, Route, Link } from 'react-router-dom'function App() {return (<BrowserRouter>{/* 導航鏈接 */}<nav><Link to="/">首頁</Link><Link to="/about">關于</Link><Link to="/user">用戶</Link></nav>{/* 路由配置 */}<Routes><Route path="/" element={<Home />} /><Route path="/about" element={<About />} /><Route path="/user" element={<User />} /></Routes></BrowserRouter>)
}

4. 路由類型

1.?BrowserRouter:使用 HTML5 history API

<BrowserRouter>{/* 你的應用 */}
</BrowserRouter>

2.HashRouter:使用?URL 的 hash 部分

<HashRouter>{/* 你的應用 */}
</HashRouter>

5. 路由導航

1.聲明式導航(Link組件):

<Link to="/about">關于我們</Link>
<Link to="/user/123">用戶詳情</Link>

2.編程式導航(useNavigate鉤子) :

import { useNavigate } from 'react-router-dom'function LoginButton() {const navigate = useNavigate()const handleLogin = () => {// 登錄成功后跳轉navigate('/dashboard')// 帶參數跳轉navigate('/user', { state: { id: 123 } })// 返回上一頁navigate(-1)}return <button onClick={handleLogin}>登錄</button>
}

6. 路由參數

1.?URL參數:

// 路由配置
<Route path="/user/:id" element={<UserDetail />} />// 組件中獲取參數
import { useParams } from 'react-router-dom'function UserDetail() {const { id } = useParams()return <div>用戶ID:{id}</div>
}

2. 查詢參數:

// 使用查詢參數
<Link to="/search?keyword=react">搜索</Link>// 獲取查詢參數
import { useSearchParams } from 'react-router-dom'function Search() {const [searchParams] = useSearchParams()const keyword = searchParams.get('keyword')return <div>搜索關鍵詞:{keyword}</div>
}

7. 嵌套路由

function App() {return (<Routes><Route path="/" element={<Layout />}><Route index element={<Home />} /><Route path="about" element={<About />} /><Route path="users" element={<Users />}><Route path=":id" element={<UserDetail />} /></Route></Route></Routes>)
}// Layout組件
function Layout() {return (<div><nav>{/* 導航欄 */}</nav><Outlet /> {/* 子路由渲染位置 */}</div>)
}

8. 路由守衛(保護路由)

function PrivateRoute({ children }) {const isAuthenticated = checkAuth() // 檢查用戶是否登錄if (!isAuthenticated) {return <Navigate to="/login" replace />}return children
}// 使用
<Route path="/dashboard" element={<PrivateRoute><Dashboard /></PrivateRoute>} 
/>

9. 路由鉤子

// 1. useLocation - 獲取當前路由信息
function Component() {const location = useLocation()console.log(location.pathname) // 當前路徑console.log(location.search)   // 查詢參數console.log(location.state)    // 路由狀態
}// 2. useNavigate - 編程式導航
function Component() {const navigate = useNavigate()navigate('/path')
}// 3. useParams - 獲取URL參數
function Component() {const { id } = useParams()
}// 4. useSearchParams - 獲取查詢參數
function Component() {const [searchParams, setSearchParams] = useSearchParams()
}

10. 實際應用示例

// 完整的路由配置示例
import { BrowserRouter, Routes, Route, Navigate } from 'react-router-dom'function App() {return (<BrowserRouter><Routes>{/* 公共路由 */}<Route path="/" element={<Layout />}><Route index element={<Home />} /><Route path="about" element={<About />} /><Route path="products" element={<Products />}><Route path=":id" element={<ProductDetail />} /></Route>{/* 需要認證的路由 */}<Route path="dashboard" element={<PrivateRoute><Dashboard /></PrivateRoute>}><Route path="profile" element={<Profile />} /><Route path="settings" element={<Settings />} /></Route>{/* 404頁面 */}<Route path="*" element={<NotFound />} />{/* 重定向 */}<Route path="old-path" element={<Navigate to="/new-path" replace />} /></Route></Routes></BrowserRouter>)
}

11. 最佳實踐

1.路由配置集中管理:

// routes.js
const routes = [{path: '/',element: <Layout />,children: [{ index: true, element: <Home /> },{ path: 'about', element: <About /> },{ path: 'users', element: <Users /> }]}
]// App.jsx
import { useRoutes } from 'react-router-dom'function App() {const element = useRoutes(routes)return element
}

2.懶加載路由:

import { lazy, Suspense } from 'react'const Dashboard = lazy(() => import('./pages/Dashboard'))function App() {return (<Routes><Route path="/dashboard" element={<Suspense fallback={<Loading />}><Dashboard /></Suspense>} /></Routes>)
}

這些內容涵蓋了?React Router 的主要使用方法。記住:

  • 總是在應用最外層包裹?BrowserRouter
  • 使用?Routes?和?Route?定義路由規則
  • 使用?Link?或?useNavigate?進行導航
  • 合理使用路由鉤子獲取和操作路由信息
  • 需要時使用路由守衛保護私有路由
  • 考慮使用懶加載優化性能

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

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

相關文章

人工智能的視覺天賦:一文讀懂卷積神經網絡

什么是CNN&#xff1f; CNN&#xff0c;全稱為卷積神經網絡&#xff08;Convolutional Neural Network&#xff09;&#xff0c;是一種模擬人類視覺感知機制的人工神經網絡。它通過層疊的卷積、池化等操作&#xff0c;從數據中提取關鍵特征&#xff0c;進而完成分類、識別或預…

【OpenGL ES】GLSL基礎語法

1 前言 本文將介紹 GLSL 中數據類型、數組、結構體、宏、運算符、向量運算、矩陣運算、函數、流程控制、精度限定符、變量限定符&#xff08;in、out、inout&#xff09;、函數參數限定符等內容&#xff0c;另外提供了一個 include 工具&#xff0c;方便多文件管理 glsl 代碼&a…

使用 ECharts 與 Vue 構建數據可視化組件

在前端開發中&#xff0c;數據可視化是非常重要的一部分。ECharts 作為一個功能強大且易于使用的開源數據可視化庫&#xff0c;被廣泛應用于各種圖表展示需求中。而 Vue.js 是當下流行的前端框架之一&#xff0c;它的數據驅動和組件化開發模式讓我們能輕松地將 ECharts 集成到 …

RPA系列-uipath 學習筆記4

使用Uipath 處理hover的問題 備注&#xff1a;使用uipath stversion&#xff1a;2024.10.6,所有學習來源自uipath Academy 首先&#xff0c;打開uipath給我們提供的一個網站 ACME,這個網站呢&#xff0c;需要提前注冊一下的哈。 今天呢&#xff0c;就是記錄一下&#xff0c;怎…

Linux:進程概念

1.馮諾依曼體系結構 結論&#xff1a; --- CPU不和外設直接打交道&#xff0c;和內存直接打交道。 --- 所有的外設&#xff0c;有數據需要收入&#xff0c;只能載入到內存中&#xff1b;內存寫出&#xff0c;也一定是寫道外設中。 --- 為什么程序要運行必須加載到內存&#xf…

活動預告 | Microsoft Azure 在線技術公開課:使用 Azure OpenAI 服務構建生成式應用

課程介紹 通過 Microsoft Learn 免費參加 Microsoft Azure 在線技術公開課&#xff0c;掌握創造新機遇所需的技能&#xff0c;加快對 Microsoft Cloud 技術的了解。參加我們舉辦的“使用 Azure OpenAI 服務構建生成式應用”活動&#xff0c;了解如何使用包括 GPT 在內的強大的…

Linux(Centos 7.6)常見基礎配置

1.網絡配置 網絡配置詳見&#xff1a;VMware安裝Linux(Centos 7.6)后網絡配置 2.yum源配置 yum源配置詳見&#xff1a;Linux(Centos 7.6)yum源配置 3.主機名配置 1.Linux(Centos 7.6)系統安裝后&#xff0c;沒有配置主機名時&#xff0c;root用戶登錄后&#xff0c;是如下…

【PyCharm】如何把本地整個項目同步到服務器?

在PyCharm中&#xff0c;您可以使用部署功能將項目同步到服務器。以下是步驟和示例配置&#xff1a; 打開PyCharm&#xff0c;選擇您的項目。 點擊菜單欄的 “File” -> “Settings” -> “Build, Execution, Deployment”。 在左側菜單中&#xff0c;選擇 “Deployme…

電子電器架構 ---什么是智能電動汽車上的逆變器?

我是穿拖鞋的漢子,魔都中堅持長期主義的汽車電子工程師。 老規矩,分享一段喜歡的文字,避免自己成為高知識低文化的工程師: 所謂雞湯,要么蠱惑你認命,要么慫恿你拼命,但都是回避問題的根源,以現象替代邏輯,以情緒代替思考,把消極接受現實的懦弱,偽裝成樂觀面對不幸的…

Flutter:打包apk,詳細圖文介紹

困擾了一天&#xff0c;終于能正常打包apk安裝了&#xff0c;記錄下打包的流程。建議參考我這篇文章時&#xff0c;同時看下官網的構建說明。 官網構建并發布 Android 應用詳情 1、AS創建Flutter項目 2、cmd執行命令 生成一個sunluyi.jks的文件&#xff0c;可以自行把sunluyi替…

【服務器學習專欄 1.2 -- 帶外管理】

請閱讀 嵌入式學習必備專欄 文章目錄 Overview服務器帶外管理BMC 介紹BMC 特點BMC 工作原理 Overview 從技術的角度&#xff0c;網絡管理可分為帶外管理&#xff08;out-of-band&#xff09;和帶內管理&#xff08;in-band&#xff09;兩種管理模式。 帶內管理&#xff0c;是指…

南京市建鄴區南苑街道一行蒞臨園區考察交流

2024年8月28日&#xff0c;南京市建鄴區南苑街道辦事處副主任董兵、南苑街道發展服務辦公室一級主任科員王洪政、建鄴區國資集團科創公司經理杲暢&#xff0c;在樹莓集團華東區負責人田林和陳強經理的陪同下&#xff0c;蒞臨集團總部-國際數字影像產業園考察交流。 樹莓科技&am…

docker中使用nginx

宿主機和docker中nginx做映射 宿主機中nginx 映射目錄 /root/myDockerData/devnginx 在容器中相關位置分別是&#xff1a; 配置文件位置&#xff1a;/etc/nginx/ 日志位置&#xff1a;/var/log/nginx/ 項目位置&#xff1a;/usr/share/nginx/html 如下配置啟動命令行&#x…

【ES6復習筆記】對象方法擴展(17)

對象方法擴展 在 JavaScript 中&#xff0c;對象是屬性和方法的集合。除了內置的方法&#xff0c;我們還可以通過擴展對象的原型來添加新的方法。本教程將介紹如何使用 Object.is、Object.assign 和 Object.setPrototypeOf 方法來擴展對象。 1. Object.is 判斷兩個值是否完全…

基于JDK 17 編寫的Java常用工具類

文章目錄 DateUtilsEncryptUtilsFunIdCardCalibrationUtilResultResultCodeValidateNameUtilValidatePhoneUtil 廢話少說看源碼 DateUtils package com.huihang.core.utils;import java.time.Duration; import java.time.LocalDate; import java.time.LocalDateTime; import j…

Casino Royale靶場wp

0x00 下載安裝 https://download.vulnhub.com/casinoroyale/CasinoRoyale.ova 導入vmware啟動 0x01 主機信息收集 0x02目錄掃描 index.php 獲取到一個域名 修改本地hosts 添加一行 路徑&#xff1a;C:\Windows\System32\drivers\etc 192.168.2.20 casino-royale.local 點擊…

智能家居體驗大變革 博聯 AI 方案讓智能不再繁瑣

1. 全球AI技術發展背景及智能家居市場趨勢 人工智能&#xff08;AI&#xff09;技術的飛速發展正在推動全球各行業的數字化轉型。國際電信聯盟與德勤聯合發布《人工智能向善影響》報告指出&#xff0c;全球94%的商界領袖認為&#xff0c;人工智能技術對于其企業在未來5年內的發…

鴻蒙開發(27)案例今日任務

案例為純前端實現&#xff0c;總結案例。 主頁面代碼 import { TaskStatisties } from ../view/TaskStatisties import { TaskItem } from ../view/TaskItem import CreateTaskModel, {TaskModel} from ../viewmodel/TaskModel import { router } from kit.ArkUI// xxx.ets En…

WPF編程excel表格操作

WPF編程excel表格操作 摘要NPOI安裝封裝代碼測試代碼 摘要 Excel操作幾種方式 使用開源庫NPOI(常用&#xff0c;操作豐富)使用Microsoft.Office.Interop.Excel COM組件(兼容性問題)使用OpenXml(效率高)使用OleDb(過時) NPOI安裝 封裝代碼 using System; using System.IO; u…

tcp_rcv_synsent_state_process函數

tcp_rcv_synsent_state_process 是 Linux Kernel 中用于處理 TCP 連接在 SYN-SENT 狀態下接收到報文的函數。這個函數在 TCP 三次握手階段起到了至關重要的作用,處理了在客戶端發送 SYN 請求之后收到服務器響應報文的各種情況。 以下是這個函數的解讀和剖析: int tcp_rcv_sy…