【React】路由器 React-Router

  • 安裝
  • 路由模式
  • 路由組件和屬性 (Link、NavLink、Outlet、Routes、Navigate、element)
  • 路由傳參 ( Hook:useParams 、useSearchParams )
  • 路由跳轉(Hook:useNavigate)
  • 路由的構建

前端路由指的是一種將瀏覽器URL與特定頁面或視圖關聯起來的技術。在傳統的Web開發中,當用戶點擊鏈接或者輸入URL時,服務器會接收到請求并返回相應的HTML頁面。而在前端路由中,當用戶點擊鏈接或者輸入URL時,瀏覽器會根據路由規則對URL進行解析,并使用JavaScript控制頁面的展示。

前端路由通常使用JavaScript庫來實現,比如React Router、Vue Router等。它們允許開發者定義路由規則,并根據這些規則來顯示不同的組件或頁面

前端路由可以提高Web應用的性能和用戶體驗,因為它允許應用實現快速的頁面切換和動態的內容加載,同時減少了服務器的負載

安裝

官網:https://reactrouter.com/homeReactRouter包含三個內容:(1) react-router:核心庫;(2) react-router-dom:正常PC用的;(3) react-router-native:移動native用的當前使用版本:"react-router-dom": "^6.30.0"安裝:npm install react-router-dom@6

路由模式

React的路由需要在某個模式下包裹使用,不能單獨使用

HashRouter(哈希路由):類似a標簽錨點,在本頁跳轉,所以拿不到歷史記錄,因為沒有跳出當前頁面http://localhost:3000/#/homeHistory(在React中叫BrowserRouter,歷史記錄模式):模擬歷史記錄模式,可以有前進后退的歷史記錄http://localhost:3000/home//刷新頁面,<BrowserRouter>會將當前路由發送到服務器//需要后端配合就是當收到請求的url不是功能性的,而是前端路由時,重新加載入口html文件

路由組件和屬性 (Link、NavLink、Outlet、Routes、Navigate、element)

Link:負責跳轉NavLink:將包裹的內容渲染為a標簽,并給Link加上一個樣式active類,設置類的樣式達到激活菜單的效果Outlet:相當于一個占位符,目的就是為了用來占位展示當前組件對應的Home1和Home2(類似于vue中的router-view)Routes:路由攔截并展示對應的組件<Routes><Route path={"/home"} element={<Home/>}/><Route path={"/about"} element={<About/>}/></Routes>element:表示對應組件Navigate:相對于重定向路由嵌套的時候:子組件的path不需要寫斜杠"/",直接寫就好<Route path={"/home"} element={<Home/>}><Route path="home1" element={<Home1/>}/><Route path="home2" element={<Home2/>}/></Route>默認展示組件:<Route index element={<Home1/>}/>  <!--index表示默認要展示的組件,去掉path-->

src\App.js

import './App.scss';
import {HashRouter,  //-----路由容器,裝路由組件// Link,  //-----跳轉Routes,  //-----路由攔截展示的容器Route,  //-----攔截路徑,設置展示組件Navigate,  //-----類似重定向NavLink,  //-----跳轉,帶active類,但需要自己寫樣式// BrowserRouter  //-----路由容器,裝路由組件//Outlet  //-----占位符,用來展示嵌套路由的子組件的內容
} from 'react-router-dom';import Home from "./Home";
import About from "./About";
import Home1 from "./Hom1";
import Home2 from "./Home2";// 用戶亂輸入地址欄url,則返回404頁面組件
const Err=()=><div>Error錯誤404頁面</div>//React-Router案例
function App() {return (<>{/*<BrowserRouter>*/}<HashRouter future={{v7_startTransition: true,v7_relativeSplatPath: true/*解決:使用react-router-dom@6.30.0版本時,組件默認打印未來版本的警告信息,影響項目代碼功能調試*/}}>{/*<Link to={"/home"}>Home</Link>*/}  {/*你要去哪里*/}<NavLink to={"/home"}>Home</NavLink>{/*<Link to={"/about"}>About</Link>*/}{/*<NavLink to={"/about/月亮/25"}>About</NavLink>*/}  {/*路由傳參*/}<NavLink to={"/about?a=1&b=2"}>About</NavLink><Routes> {/*攔截并展示對應的組件*/}<Route path="/" element={<Navigate to={"/home"}/>}/>  {/*通用攔截*/}<Route path={"/home"} element={<Home/>}>{/*<Route path={"home1"} element={<Home1/>}/>  /!*嵌套子路由*!/*/}<Route index element={<Home1/>}/>  {/*index表示默認要展示的組件,去掉path*/}<Route path={"home1"} element={<Home1/>}/>  {/*加上這一行即可,因為上一行沒法攔截對應路由,它本身還是要寫*/}<Route path={"home2"} element={<Home2/>}/></Route>{/*<Route path={"/home/"} element={<Navigate to={"/home/home1"}/>}/>   /!*默認要展示的組件(自想方法)*!/*/}{/*<Route path={"/about/:name/:id"} element={<About/>}/>*/}   {/*路由接參*/}<Route path={"/about"} element={<About/>}/><Route path={"*"} element={<Err/>}/>  {/*錯誤404頁面*/}</Routes></HashRouter>{/*</BrowserRouter>*/}</>);
}export default App;
import {NavLink, Outlet} from "react-router-dom";const Home = () => <div><h1>Home</h1><NavLink to={"/home/home1"}>Home1</NavLink><NavLink to={"/home/home2"}>Home2</NavLink><Outlet/> {/*占位符,用來展示Home1和Home2內容的*/}
</div>;export default Home;

路由傳參 ( Hook:useParams 、useSearchParams )

import引入的路由都是引入的屬性(大寫開頭);除了屬性之外,路由還可以引入方法(所有的方法都是useXxx的格式)

路由傳參(useParams):1. <NavLink to={"/about/25"}>About</NavLink>   <!--帶參跳轉,可以傳遞多個參數,右斜杠隔開-->2. <Route path={"/about/:id"} element={<About/>}/>   <!--這里會有參數并且是通過id接收-->3.組件獲取import {useParams   <!--獲取路由傳參的方法-->} from 'react-router-dom';const params=useParams();console.log(params.id); <!--{}-->路由傳參第二種方式(useSearchParams):1. <NavLink to={"/about?a=1&b=2"}>About</NavLink>  <!--傳了兩個參數 a,b-->2. <Route path={"/about"} element={<About/>}/>3.獲取參數import {useSearchParams} from 'react-router-dom';const [search]=useSearchParams();console.log(search.get("a"));  <!--通過get方法獲取指定參數-->
import {// useParams,  //獲取路由傳參的方法useSearchParams
} from 'react-router-dom';const About=()=> {// const params=useParams();// console.log(params.name);const [search,setSearch]=useSearchParams();console.log(search.get("a"));console.log(search); //{size:2} 遍歷出來search.forEach((v,i)=>{console.log(i,v)})return (<h2>About</h2>)
}export default About;

路由跳轉(Hook:useNavigate)

React跳轉(useNavigate):(在Vue中,push() 會產生歷史記錄,replace() 不會產生歷史記錄)import {useNavigate} from "react-router-dom";const navigate=useNavigate();navigate("/home/home2");  <!--這種頁面跳轉相當于添加了一條歷史記錄-->navigate("/home/home2",{replace: true});  <!--這種頁面跳轉相當于替換掉了一條歷史記錄-->navigate(-1)  <!--返回 -1:上一頁,0:當前頁,1:下一頁-->
import {useNavigate} from "react-router-dom";const Home1=()=>{const navigate=useNavigate();const goHome2=()=> {// navigate("/home/home2");  //這種頁面跳轉相當于添加了一條歷史記錄navigate("/home/home2",{replace: true});  //這種頁面跳轉相當于替換掉了一條歷史記錄}return (<div><h2>Home1</h2><button onClick={goHome2}>跳到Home2</button></div>)
}export default Home1;
import {useNavigate} from "react-router-dom";const Home2=()=>{const navigate=useNavigate();const goBack=()=>{navigate(-1)}return (<div><h2>Home2</h2><button onClick={goBack}>返回</button></div>)
}export default Home2;

路由的構建

src\index.js

import React from 'react';
import ReactDOM from 'react-dom/client';
import './index.css';
import App from './App';import {HashRouter} from "react-router-dom";const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(<HashRouter><App /></HashRouter>
);

src\App.js

import './App.css';
import Routers from './router'function App() {return (<div className="App"><Routers/></div>);
}export default App;

router\index.js

import {useRoutes,Navigate,
} from 'react-router-dom'
import Power from "./power"; //進行權限判斷處理import Home from '../pages/home'
import Login from '../pages/login'
import Admin from '../pages/home/admin'
import Notice from "../pages/home/notice"
import Student from "../pages/home/student"//路由配置的組件
const Routers=()=>{return useRoutes([{path:'/',element:<Navigate to={"/login"}/>},{path:'/login',element:<Login/>},{path:'/home',// element:<Home/>,// element:Power(<Home/>,"/home"), /*高階函數*/element:<Power path='/home' ele={<Home/>}/>, /*高階組件*/children:[            /*子路由*/{index:"index", /*默認展示當前的子組件*/// path:'admin', /*子路由不需要 /admin 這樣寫,斜杠不需要*/element:<Power path='/home/notice' ele={<Notice/>}/>},{path:'notice',element:<Power path='/home/notice' ele={<Notice/>}/>},{path:'student',element:<Power path='/home/student' ele={<Student/>}/>},{path:'admin',element:<Power path='/home/admin' ele={<Admin/>}/>}]}])}export  default Routers;

router\power.js 高階組件

const Power=(props)=>{console.log("Power執行")  //避免多次重復執行,在router中應寫作組件<power/>,而不是直接調用Power()console.log(props)//這里攔截判斷是否可以返回當前組件//取出sessionStorage中的power比對,如果本地數據中有就返回當前組件,如果本地用戶數據中沒有就不返回當前組件let power=JSON.parse(sessionStorage.getItem("power")); //[{},{},{}]for(let i=0;i<power.length;i++){if(power[i].link.indexOf(props.path)!==-1){  //有權限訪問return <>{props.ele}</>}}return <div><h1>沒有權限</h1></div>;  //循環完了都沒找到有的話,就是沒有權限}export default Power;

權限攔截:

現在的路由是攔截到請求,直接返回對應的組件,實際上應該先查看用戶是否有權限訪問需要寫一個函數,接收一個組件為參數。如果有權限,就返回組件;如果沒有權限就返回登錄或者錯誤組件{path:'/home',// element:<Home/>,    -------以前直接返回組件element:Power(<Home/>),   -------把組件轉入Power函數,在函數內部進行邏輯判斷,最后根據權限返回需要展示的組件}element:Power(<Home/>)   -------向一個函數傳遞一個組件作為參數,我們稱為高階組件,函數負責邏輯代碼,組件負責頁面展示高階組件,源于高階函數,高階函數就是把函數A作為參數傳給函數B,調用函數B返回一個新的函數C<script>function HOF(fn){  //函數Breturn function(){  //函數Cfn()}}let myFn=HOF(()=>{  //函數Aconsole.log("哈哈哈哈")})myFn();</script>高階組件HOC,向一個函數A傳遞一個組件C作為參數,最后返回一個新的組件(使用高階組件的目的,為了組件的二次加工,或者功能邏輯判斷)項目啟動后,路由中的Power函數會被執行

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

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

相關文章

Flowable7.x學習筆記(十)分頁查詢已部署 BPMN XML 流程

前言 上一篇文章我們已經完成了流程的部署功能&#xff0c;那么下一步就是要激活流程了&#xff0c;但是我們要需要明確的指定具體要激活部署后的哪一條流程&#xff0c;所以我們先把已部署的基礎信息以及具體定義信息分頁查詢出來&#xff0c;本文先把基礎代碼生成以及完成分頁…

【論文閱讀23】-地下水預測-TCN-LSTM-Attention(2024-11)

這篇論文主要圍繞利用深度學習模型檢測地下水位異常以識別地震前兆展開。 [1] Chen X, Yang L, Liao X, et al. Groundwater level prediction and earthquake precursor anomaly analysis based on TCN-LSTM-attention network[J]. IEEE Access, 2024, 12: 176696-176718. 期刊…

electron從安裝到啟動再到打包全教程

目錄 介紹 安裝 修改npm包配置 執行安裝命令 源代碼 運行 打包 先安裝git, 安裝打包工具 導入打包工具 執行打包命令 總結 介紹 electron確實好用,但安裝是真的要耗費半條命。每次安裝都會遇到各種問題,然后解決了之后。后面就不需要安裝了,但有時候比如電腦重裝…

【Rust 精進之路之第4篇-數據基石·上】標量類型:整數、浮點數、布爾與字符的精妙之處

系列&#xff1a; Rust 精進之路&#xff1a;構建可靠、高效軟件的底層邏輯 作者&#xff1a; 碼覺客 發布日期&#xff1a; 2025-04-20 引言&#xff1a;構成萬物的“原子”——標量類型 在上一篇文章【變量觀】中&#xff0c;我們深入探討了 Rust 如何通過 let、mut、const…

消息中間件RabbitMQ:簡要介紹及其Windows安裝流程

一、簡要介紹 定義&#xff1a;RabbitMQ 是一個開源消息中間件&#xff0c;用于實現消息隊列和異步通信。 場景&#xff1a;適用于分布式系統、異步任務處理、消息解耦、負載均衡等場景。 比喻&#xff1a;RabbitMQ 就像是快遞公司&#xff0c;負責在不同系統間安全快速地傳遞…

Docker概念詳解

文章目錄 一、Docker&#xff1a;容器化應用的基石1.1 環境1.2 Docker 是什么1.3 Docker鏡像1.3.1 基礎鏡像(Base Image)1.3.2 Dockerfile1.3.3 容器鏡像&#xff08;Container Image&#xff09; 1.4 Registry1.5 容器1.6 Docker VS 虛擬機 二、Docker 的架構原理2.1 C/S軟件架…

linux查看及修改用戶過期時間

修改用戶有效期 密碼到期時間 sudo chage -E 2025-12-31 username sudo chage -M 180 username sudo chage -d $(date %F) username 查詢用戶密碼到期時間 for user in $(cat /etc/passwd |cut -d: -f1); do echo $user; chage -l $user | grep "Password expires"; …

CGAL 計算直線之間的距離(3D)

文章目錄 一、簡介二、實現代碼三、實現效果一、簡介 這里的計算思路很簡單: 1、首先將兩個三維直線均平移至過原點處,這里兩條直線可以構成一個平面normal。 2、如果兩個直線平行,那么兩條直線之間的距離就轉換為直線上一點到另一直線的距離。 3、如果兩個直線不平行,則可…

<項目代碼>YOLO小船識別<目標檢測>

項目代碼下載鏈接 YOLOv8是一種單階段&#xff08;one-stage&#xff09;檢測算法&#xff0c;它將目標檢測問題轉化為一個回歸問題&#xff0c;能夠在一次前向傳播過程中同時完成目標的分類和定位任務。相較于兩階段檢測算法&#xff08;如Faster R-CNN&#xff09;&#xff0…

基于RK3588+FPGA+AI YOLO全國產化的無人船目標檢測系統(二)平臺設計

基于項目需求確定國產 AI 平臺的總體架構設計&#xff0c;完成硬件單元的選擇和搭建以及開發工具鏈的配置工作。 4.1 國產 AI 平臺總體架構 本文設計了一套靈活高效的國產 AI 平臺總體架構&#xff0c;設計方法是在嵌入式平 臺上使用串行總線&#xff08; Peripheral Co…

Typescript中的泛型約束extends keyof

概要 本文主要分享Typescript中泛型約束的使用方法。在開發過程中&#xff0c;通過使用該方法&#xff0c;可以在編譯階段&#xff0c;幫助我們查找到一些潛在的空值引用錯誤。 代碼和實現 我們預先定義了IUser接口&#xff0c;接口包括了id&#xff0c;姓名&#xff0c;性別…

C++ 2025 展望:現代編程需求與新興技術驅動下的變革

C 作為一門成熟的語言&#xff0c;在多個領域&#xff08;嵌入式系統、高性能計算、圖形渲染、游戲開發等&#xff09;依舊占據重要地位。在 2024 年&#xff0c;C 開發繼續在許多傳統領域保持強勁的勢頭&#xff0c;同時也面臨著新的挑戰與發展方向。展望 2025 年&#xff0c;…

包管理工具有哪些?主流軟件分享

常見的包管理工具主要有&#xff1a;npm、Yarn、pnpm、Composer、Maven、pip、Conda 等&#xff0c;其中 npm 是目前全球使用最廣泛的JavaScript包管理工具&#xff0c;以豐富的生態、便捷的使用體驗以及強大的社區支持聞名。npm具備依賴管理、版本控制、腳本執行等強大功能&am…

2025年世界職業院校技能大賽實施方案(意見稿)

為貫徹落實《教育強國建設規劃綱要&#xff08;2024—2035年&#xff09;》&#xff0c;進一步提升世界職業院校技能大賽&#xff08;以下簡稱“大賽”&#xff09;內涵質量&#xff0c;發揮大賽引領作用&#xff0c;提升高技能人才培養質量&#xff0c;服務現代職業教育體系建…

Redis 慢查詢分析與優化

Redis 慢查詢分析與優化 參考書籍 &#xff1a; https://weread.qq.com/web/reader/d5432be0813ab98b6g0133f5kd8232f00235d82c8d161fb2 以下從配置參數、耗時細分、分析工具、優化策略四個維度深入解析 Redis 慢查詢問題&#xff0c;結合實戰調優建議&#xff0c;幫助開發者…

AI之pdf解析:Tesseract、PaddleOCR、RapidPaddle(可能為 RapidOCR)和 plumberpdf 的對比分析及使用建議

目錄標題 Tesseract、PaddleOCR、RapidPaddle&#xff08;可能為 RapidOCR&#xff09;和 plumberpdf 的對比分析1. Tesseract類型: 開源 OCR 引擎特點:缺點:適用場景: 2. PaddleOCR (推薦)類型:特點:缺點:適用場景: 復雜版式文檔、多語言混合文本、需要高精度識別的場景&#…

算法 | 成長優化算法(Growth Optimizer,GO)原理,公式,應用,算法改進研究綜述,matlab代碼

===================================================== github:https://github.com/MichaelBeechan CSDN:https://blog.csdn.net/u011344545 ===================================================== 成長優化算法 一、算法原理二、核心公式三、應用領域四、算法改進研究五…

網絡原理(TCP協議—協議格式,性質(上),狀態)

目錄 1.TCP協議段格式。 2.TCP協議傳輸時候的性質。 2.1確認應答。 2.2超時重傳。 2.3連接管理。 2.3.1 三次握手。 2.3.2四次揮手。 3.TCP常見的狀態。 1.TCP協議段格式。 TCP協議段是由首部和數據兩部分構成的。首部包含了TCP通信所需要的各種控制信息&#xff0c;而…

XAML 標記擴展

# XAML 標記擴展詳解 標記擴展(Markup Extensions)是XAML中一種特殊的語法結構&#xff0c;允許在XAML屬性中嵌入動態值或引用&#xff0c;而不是簡單的靜態值。它們使用花括號{}作為標識&#xff0c;是XAML強大功能的核心組成部分。 ## 基本語法結構 所有標記擴展都遵循以下…

DeepSeek+Cursor+Devbox+Sealos項目實戰

黑馬程序員DeepSeekCursorDevboxSealos帶你零代碼搞定實戰項目開發部署視頻教程&#xff0c;基于AI完成項目的設計、開發、測試、聯調、部署全流程 原視頻地址視頻選的項目非常基礎&#xff0c;基本就是過了個web開發流程&#xff0c;但我在實際跟著操作時&#xff0c;ai依然會…