react路由總結

目錄

一、腳手架基礎語法(16~17)

1.1、hello react

1.2、組件樣式隔離(樣式模塊化)

1.3、react插件

二、React Router v5

2.1、react-router-dom相關API

2.1.1、內置組件

2.1.1.1、BrowserRouter

2.1.1.2、HashRouter

2.1.1.3、Route

2.1.1.4、Redirect

2.1.1.5、Link

2.1.1.6、NavLink

2.1.1.7、Switch

2.1.2、其它

2.1.2.1、history對象

2.1.2.2、match對象

2.1.2.3、withRouter對象

2.2、向路由組件傳參

2.2.1、傳遞params參數

2.2.2、傳遞search參數

2.2.3、傳遞state參數

2.3、編程式路由導航跳轉

三、React Router v6

3.1、一級路由

3.2、重定向

3.3、NavLink高亮

3.4、useRoutes

3.5、嵌套路由

3.6、路由傳參

3.6.1、params

3.6.2、search

3.6.3、state

3.7、編程式路由導航

3.8、use拓展

四、V6 pk?V5

一、腳手架基礎語法(16~17)

1.1、hello react

1.2、組件樣式隔離(樣式模塊化)

已知:vue2通過scoped來防止組件樣式沖突

react解決方法:樣式模塊化(CSS Modules)

使用方法:
1、將?CSS?文件命名為?[name].module.css
2、在組件中導入樣式模塊,并使用對象屬性訪問樣式類名。

import "./hello.css";//直接引入
import styles from "./hello.module.css";//樣式模塊化
<h2 className={styles.title}>hello react!</h2>

補充:Styled Components、Emotion、Shadow DOM 和 CSS 命名空間等方案也可以。

1.3、react插件

VScode插件搜索react:ES7+ React/Redux/React-Native snippets

輸入rcc:類組件? ?rfc:函數組件回車即可

更多快捷代碼塊:vscode-react-javascript-snippets/docs/Snippets.md at 185bb91a0b692c54136663464e8225872c434637 · r5n-labs/vscode-react-javascript-snippets · GitHub

二、React Router v5

1、SPA:單頁面應用

? ? ? (1)、點擊頁面中的鏈接不會刷新頁面,只做頁面的局部刷新

? ? ? (2)、數據都通過ajax請求獲取,并在前端異步展現

2、路由:一個路由就是一個映射關系(key:value)

? ? ? key為路徑,value可能是function【后端路由】或component【前端路由】

? ? ? 前端:當瀏覽器的path變為/XX時,當前路由組件就會變為XX組件,依賴瀏覽器的 hash history API來管理 URL 狀態。

2.1、react-router-dom相關API

下載:npm i?react-router-dom@5

路由組件和一般組件接收的props不同,前者會接收到三個history、location、match固定屬性。

2.1.1、內置組件

import { BrowserRouter as Router, Route, Switch, Redirect,Link } from 'react-router-dom'
export default class App extends Component {render() {return (<div><Router>
{/* Switch雖然在v5版本不是必須的,但是基本都會用到,只讓頁面匹配上一個,不能匹配上多個 */}<Switch>
<Route path='/' exact render={() => <Redirect to='/index'></Redirect>}></Route>
<Route path='/index' render={(props) => {
//想要進入到主頁,如果此時還未登錄就重定向到登錄頁,如果已經登陸了就進入首頁if (isLogin()) {
// Home組件并不是路由組件,render的函數式組件才是真正的路由組件,需要把props的內容傳到Home組件中。return <Home {...props}></Home>} else {return <Redirect to='/login'></Redirect>}
}}></Route>
<Route path='/login' render={(props) => {if (isLogin()) {return <Redirect to='/index/home'></Redirect>} else {return <Login {...props}></Login>}
}}></Route></Switch><div className="left-side"><Link to="/about">About</Link><Link to="/home">Home</Link></div><div className="right-content"><Route path="/about" component={About}></Route><Route path="/home" component={Home}></Route></div></Router></div>)}
}
2.1.1.1、BrowserRouter

使用?HTML5?history?API?來保持URL?路徑不帶?#,適合現代?Web?應用

2.1.1.2、HashRouter

使用?#?來管理?URL,適合不支持HTML5?history?API的老版本瀏覽器,刷新后會導致路由參數丟失

2.1.1.3、Route

<Route>?:用于定義路徑和對應組件的基本單元

<Route path="/home" component={<Home />} />
2.1.1.4、Redirect

重定向:<Redirect to='/index'></Redirect>

2.1.1.5、Link

是React Router提供的用于頁面跳轉的組件,類似于HTML的<a>標簽,但不會引起頁面刷新

2.1.1.6、NavLink

特殊的<Link>,添加了活動樣式(activeClassName),通過this.props.children獲取標簽體內容

<NavLink to="/home" activeClassName="active">Go to Home</NavLink>
2.1.1.7、Switch

只讓頁面匹配上一個,不能匹配上多個,提高路由匹配效率

拓展:

? ? ? ? 路由默認使用模糊匹配,如果開啟嚴格匹配【exact={true}】的話,有時會導致無法繼續匹配二級路由,不要隨便開啟。

2.1.2、其它

2.1.2.1、history對象

管理瀏覽器的會話歷史。例如推送新的路徑、替換當前路徑和返回上一頁等處理導航的方法。

 const history = useHistory();const handleNavigation = () => {history.push('/new-path'); // 導航到新的路徑};
2.1.2.2、match對象

包含了與當前路由匹配的信息,它通常在路由組件中作為 props 傳遞。

const User = ({ match }) => {return <div>User ID: {match.params.userId}</div>;
};
const App = () => (<Route path="/users/:userId" component={User} />
);
2.1.2.3、withRouter對象

高階組件,用于將history、location?和match對象作為props傳遞給包裝的組件,將一般組件加工,讓其具備路由組件所特有的API。

const MyComponent = ({ history, location, match }) => {const handleNavigation = () => {history.push('/new-path'); // 導航到新的路徑};return (<div><h1>Current Path: {location.pathname}</h1><button onClick={handleNavigation}>Go to New Path</button></div>);
};
export default withRouter(MyComponent);

類組件應用路由跳轉:

import React from 'react';
import { withRouter } from 'react-router-dom';
class MyComponent extends React.Component {handleNavigate = () => {const { history } = this.props;history.push('/new-route');};render() {return (<div><button onClick={this.handleNavigate}>Go to New Route</button></div>);}
}
export default withRouter(MyComponent);

2.2、向路由組件傳參

2.2.1、傳遞params參數

類組件 :

函數組件:

const User = ({ match }) => {const { userId } = match.params;return <div>User ID: {userId}</div>;
};

2.2.2、傳遞search參數

類組件 :

函數組件:

import { useLocation } from 'react-router-dom';
const User = () => {const location = useLocation();const searchParams = new URLSearchParams(location.search);const name = searchParams.get('name');const age = searchParams.get('age');return (<div><p>Name: {name}</p><p>Age: {age}</p></div>);
};

2.2.3、傳遞state參數

類組件:

函數組件:

import { useLocation } from 'react-router-dom';
const User = () => {const location = useLocation();const { id,title } = location.state || {};return (<div><p>From Dashboard: {id}---{title}</p></div>);
};

總結:

1、params:通過路由路徑傳遞參數,使用match.params接收。
2、search:通過查詢字符串傳遞參數,使用location.searchqs.parse【基于類組件】、location.searchURLSearchParams基于函數組件接收。
3、state:通過history.pushLink的to屬性傳遞任意對象,使用location.state接收。

補充:useHistory、useLocation、useParams等Hook在React?16.8之后才可用,并通過withRouterHOC進行路由的高階組件包裝。

2.3、編程式路由導航跳轉

函數組件:

import React from 'react';
import { useHistory } from 'react-router-dom';
const MyComponent = () => {const history = useHistory(); // 獲取 history 對象const handleNavigate = () => {history.push('/new-route');};return (<div><button onClick={handleNavigate}>Go to New Route</button></div>);
};
export default MyComponent;

類組件:

<button onClick={() => this.pushShow(item.id, item.title)}>push查看</button>
<button onClick={() => this.replaceShow(item.id, item.title)}>replace查看</button>
replaceShow = (id, title) => {this.props.history.replace(`/homes/message/detail/${id}/${title}`);this.props.history.replace(`/homes/message/detail/?id=${id}/title=${title}`);this.props.history.replace(`/homes/message/detail`,{id,title});};
pushShow = (id, title) => {this.props.history.push(`/homes/message/detail/${id}/${title}`);this.props.history.push(`/homes/message/detail/?id=${id}/title=${title}`);this.props.history.push(`/homes/message/detail`,{id,title});};

三、React Router v6

下載:npm i?react-router-dom@6

3.1、一級路由

Routes:它用來包裹所有的<Route>,并且確保只渲染匹配的第一個 <Route>

<Routes><Route path="/" element={<Home />} /><Route path="/about" element={<About />} />
</Routes>

3.2、重定向

<Route path="/" element={<Navigate to="/about" />}></Route>

3.3、NavLink高亮

function computedClassName({ isActive }) {return isActive ? "list-item active" : "list-item";
}
<NavLink className={computedClassName} to="/about">About</NavLink>
<NavLink className={computedClassName} to="/homes">Home</NavLink>

3.4、useRoutes

3.5、嵌套路由

<Outlet?/>是一個占位符組件,用來渲染匹配的子路由的內容,父路由通常會渲染一個包含 <Outlet /> 的組件,這樣它就可以根據當前的 URL 渲染子路由對應的組件。

3.6、路由傳參

3.6.1、params

<Route path="/user/:id" element={<UserProfile />} />
// UserProfile 組件中接收 params 參數
import { useParams } from 'react-router-dom';
const UserProfile = () => {const { id } = useParams();return <div>User ID: {id}</div>;
};

3.6.2、search

	const [searchParams] = useSearchParams();const q = searchParams.get("q"); // 獲取查詢參數 'q'const page = searchParams.get("page"); // 獲取查詢參數 'page'return (<div><h1>搜索結果</h1><p>查詢關鍵詞:{q}</p><p>當前頁碼:{page}</p></div>);
<Link to="/search?keyword=react">搜索React</Link>
// 在組件中接收查詢參數
import { useLocation } from 'react-router-dom';
const Search = () => {const location = useLocation();const query = new URLSearchParams(location.search);const keyword = query.get("keyword");return <div>搜索關鍵詞:{keyword}</div>;
};

3.6.3、state

<Link to={{ pathname: '/detail', state: { id: 1, name: 'React' } }}>詳情</Link>
// 在目標組件中接收 state 參數
import { useLocation } from 'react-router-dom';
const Detail = () => {const location = useLocation();const { id, name } = location.state || {};return (<div><p>ID:{id}----------名稱:{name}</p></div>);
};

總結:

1、params:通過路由路徑傳遞參數,使用useParams鉤子接收。
2、search:通過查詢字符串傳遞參數,使用useSearchParams或者useLocationURLSearchParams解析。
3、state:通過LinkuseNavigate傳遞狀態參數,使用useLocation.state?來接收。

3.7、編程式路由導航

 const navigate = useNavigate();const handleClick = () => {// 導航到 "/about" 頁面,state參數寫在對象里,params與search參數之間寫url里navigate('/about', { state: { fromDashboard: true } });};

3.8、use拓展

useInRouterContext:檢查組件是否在路由上下文中。
useNavigationType:獲取當前導航類型(POP、PUSH、REPLACE)。
useOutlet:在父路由中渲染子路由的元素。
useResolvedPath:解析路徑并返回路徑對象

四、V6 pk?V5

V6相比V5,進行了以下改動:

1、Routes代替了Switch、Navigate代替了Redirect;
2、useNavigate代替了useHistory,新增useParams、useLocation等,官方推薦函數組件
3、路由匹配變得更精確,支持嵌套路由和動態路由的定義。
4、Route?組件的?API?也發生了改變,不再需要?component?或?render?屬性,使用element?屬性來傳遞渲染的組件。

若項目使用的是React?16.3 ~16.7,只能使用React?Router?v5
若項目使用的是?React?16.8?或更高版本,可以選擇React?Router?v5React?Router?v6,但建議使用v6,因為它包含了最新的功能和更簡潔的?API。

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

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

相關文章

內外網隔離文件傳輸解決方案|系統與釘釘集成+等保合規,安全提升70%

一、背景與痛點 在內外網隔離的企業網絡環境中&#xff0c;員工與外部協作伙伴&#xff08;如釘釘用戶&#xff09;的文件傳輸面臨以下挑戰&#xff1a; 1. **安全性風險**&#xff1a;內外網直連可能導致病毒傳播、數據泄露。 2. **操作繁瑣**&#xff1a;傳統方式需頻繁切…

多線程篇學習面試

多線程 1.樂觀鎖、CAS思想 java樂觀鎖機制&#xff1a; ? 樂觀鎖體現的是悲觀鎖的反面。它是一種積極的思想&#xff0c;它總是認為數據是不會被修改的&#xff0c;所以是不會對數據上鎖的。但是樂觀鎖在更新的時候會去判斷數據是否被更新過。樂觀鎖的實現方案一般有兩種&a…

云服務器和物理服務器該如何選擇

隨著互聯網的快速發展&#xff0c;企業大多都會選擇云服務器和物理服務器進行使用&#xff0c;那么對于云服務器和物理服務器兩者之間該如何進行選擇呢&#xff1f; 云服務器可以為用戶和企業提供網站處理中等到高流量所需要的一切&#xff0c;云服務器中的高可用能性功能&…

將產品照片(form.productPhotos)轉為 JSON 字符串發送給后端

文章目錄 1. 前端 form.productPhotos 的當前處理a. 組件綁定b. 當前發送邏輯 2. 如何將 form.productPhotos 轉為 JSON 字符串發送給后端a. 修改前端 save() 方法b. 確保 esave API 支持接收字符串 基于你提供的 identify-form.vue 代碼&#xff0c;我將分析如何將產品照片&a…

SpringCloud系列教程:微服務的未來(二十五)-基于注解的聲明隊列交換機、消息轉換器、業務改造

前言 在現代分布式系統中&#xff0c;消息隊列是實現服務解耦和異步處理的關鍵組件。Spring框架提供了強大的支持&#xff0c;使得與消息隊列&#xff08;如RabbitMQ、Kafka等&#xff09;的集成變得更加便捷和靈活。本文將深入探討如何利用Spring的注解驅動方式來配置和管理隊…

國產編輯器EverEdit - 文本編輯器的關鍵特性:文件變更實時監視,多頭編輯不掉坑

1 監視文件變更 1.1 應用場景 某些時候&#xff0c;用戶會使用多個編輯器打開同一個文件&#xff0c;如果在A編輯器修改保存&#xff0c;但是B編輯器沒有重新打開&#xff0c;直接在B編輯器修改再保存&#xff0c;則可能造成在A編輯器中修改的內容丟失&#xff0c;因此&#x…

HAProxy介紹與編譯安裝

目錄 1、HAProxy介紹 2、HAProxy編譯安裝 Centos 基礎環境 Ubuntu 基礎環境 編譯安裝HAProxy 驗證HAProxy版本 HAProxy啟動腳本 配置文件 啟動haproxy 驗證haproxy狀態 查看haproxy的狀態頁面 1、HAProxy介紹 HAProxy是法國開發者 威利塔羅(Willy Tarreau) 在2000年…

python類型轉換深淺拷貝

1.類型轉換 1.1 int(x):轉化為一個整數&#xff0c;只能轉換由純數字組成的字符串 float->int 浮點型強轉整形會去掉小數點后面的數&#xff0c;只保留整數部分 a 1.2 print(type(a)) #<class float> b int(a) print(type(b)) #<class int>print(int…

分布式光纖聲波振動技術在鉆井泄漏檢測中的應用

在石油天然氣的鉆井作業中&#xff0c;及時發現并定位泄漏點對于保障開采安全、降低環境污染以及避免經濟損失至關重要。傳統的泄漏檢測方法往往存在局限性&#xff0c;而分布式光纖聲波振動技術憑借其獨特的優勢&#xff0c;正逐漸成為鉆井過程中尋找泄漏的有力工具。 技術原理…

rtconfig.cpython-313.pyc 在 .gitignore文件中寫入 *.pyc 文件仍然沒有被忽略?

在 .gitignore 文件中添加 *.pyc 和 *.*.pyc 規則時&#xff0c;如果 .pyc 文件仍然沒有被忽略&#xff0c;可能有以下幾種原因&#xff1a; 1. 已經被 Git 跟蹤的文件 即使您在 .gitignore 中指定了忽略 .pyc 文件&#xff0c;Git 仍然會跟蹤已經被提交到版本庫中的文件。如…

機器學習---KNN算法核心原理和思路分析

文章目錄 1.算法介紹2.過擬合和欠擬合3.幾種不同的距離4.特征的歸一化處理 特此聲明&#xff1a;該內容是學習耿直哥的相關機器學習理論&#xff0c;也是文章里面的部分圖片素材的來源 1.算法介紹 KNN全稱叫做K Nearset Neighbor,翻譯之后就是K個最近的鄰居&#xff1b; 其實…

書生大模型實戰營14-MindSearch深度解析實踐

文章目錄 L2——進階島MindSearch深度解析實踐1 MindSearch 簡介2 開發環境配置2.1. 打開codespace主頁&#xff0c;選擇Blank模板進行創建2.2. 創建conda環境隔離并安裝依賴 3. 獲取硅基流動API KEY4. 啟動MindSearch4.1. 啟動后端4.2. 啟動前端 5. 部署到自己的 HuggingFace …

uniapp實現app的pdf預覽

實現效果 文件準備 static下添加該pdf文件&#xff08;下載地址&#xff1a;https://gitee.com/shallow-winds/resource_package/tree/master/%E6%96%B9%E6%B3%95%E4%B8%80/html&#xff09; 使用web-view進行展示&#xff1a; 在這里插入代碼片 <web-view :src"u…

重啟 nginx

首先確認Nginx是否已經安裝&#xff0c;并檢查它的安裝位置。 執行以下命令來檢查&#xff1a; which nginx#例如&#xff1a;顯示/usr/local/nginx/sbin/nginx方法1&#xff1a;直接使用完整路徑啟動Nginx 1.1、啟動 Nginx&#xff0c;執行命令&#xff1a; sudo /usr/loca…

java實現多圖合成mp4和視頻附件下載

java實現多圖合成mp4和視頻附件下載 在wutool中&#xff0c;封裝了視頻處理工具類&#xff0c;基于javacv和ffmpeg庫&#xff0c;實現多圖合成mp4、視頻http附件下載等。 關于wutool wutool是一個java代碼片段收集庫&#xff0c;針對特定場景提供輕量解決方案&#xff0c;只…

ollama修改監聽ip: 0.0.0.0

確認Ollama綁定IP地址 默認情況下&#xff0c;Ollama可能僅監聽本地回環地址&#xff08;127.0.0.1&#xff09;。要允許外部訪問&#xff0c;需將其配置為監聽所有IP&#xff08;0.0.0.0&#xff09;或指定IP&#xff08;如10…19&#xff09;。 修改啟動命令&#xff08;推薦…

STM32-溫濕度上傳OneNET項目

一、項目需求 使用 ESP8266 連接 OneNET 云平臺&#xff0c;并通過 MQTT 協議上傳 DHT11 獲取的溫濕度值。 二、項目框圖 三、DHT11工作原理 參考于良許嵌入式手把手教你玩轉DHT11&#xff08;原理驅動&#xff09; | 良許嵌入式 3.1 正常工作驗證 #? 上電后&#xff…

百度首頁上線 DeepSeek 入口,免費使用

大家好&#xff0c;我是小悟。 百度首頁正式上線了 DeepSeek 入口&#xff0c;這一重磅消息瞬間在技術圈掀起了驚濤駭浪&#xff0c;各大平臺都被刷爆了屏。 百度這次可太給力了&#xff0c;PC 端開放僅 1 小時&#xff0c;就有超千萬人涌入體驗。這速度&#xff0c;簡直比火…

Ubuntu:wvp-GB28181-pro安裝、運行

參考 https://doc.wvp-pro.cn 下載源碼 GitHub - 648540858/wvp-GB28181-pro: WEB VIDEO PLATFORM是一個基于GB28181-2016標準實現的網絡視頻平臺&#xff0c;支持NAT穿透&#xff0c;支持海康、大華、宇視等品牌的IPC、NVR、DVR接入。支持國標級聯&#xff0c;支持rtsp/rtm…

c++入門-------命名空間、缺省參數、函數重載

C系列 文章目錄 C系列前言一、命名空間二、缺省參數2.1、缺省參數概念2.2、 缺省參數分類2.2.1、全缺省參數2.2.2、半缺省參數 2.3、缺省參數的特點 三、函數重載3.1、函數重載概念3.2、構成函數重載的條件3.2.1、參數類型不同3.2.2、參數個數不同3.2.3、參數類型順序不同 前言…