解決react-router-dom沒有支持name命名使用的問題

1. 前言

react-router-dom 并不能像 vue 的route 那樣給每個路由命名 name ,導致代碼不能解耦路由路徑與導航邏輯。

2. react-router 為什么沒有支持?

很早之前官方 issue 中就有過很多討論:
在這里插入圖片描述

翻譯過來,就是由于以下幾個重要原因,所有在 1.0 版中刪除了它:

  • 動態加載路由配置(例如 getChildRoutes)意味著我們可能無法為路由配置尚未加載的 <Link> 構建真實的 URL。
  • 認為在 <Link to> 中使用真實的 URL 路徑不會花費額外的時間,您只需查找路由路徑或名稱,它們通常彼此對應。
  • 現在您無需知道參數名稱即可創建鏈接。
  • 希望鼓勵用戶不要更改 URL,而是使用 <Redirect> 代替。

鑒于上述原因,將 <Route name> 作為我們為所有人提供的 API 重新引入似乎并不值得。但是,一些用戶認為 <Route name> 仍然可以用來指定可在開發過程中使用的路由名稱。

3. 命名路由(Named Routes)的優勢

3.1 解耦路由路徑與導航邏輯

  • 問題:直接使用路徑字符串(如 to="/user/123")會導致代碼與 URL 結構強耦合,一旦路徑變更(如 /user/:id/profile/:id),所有相關代碼都需修改。
  • 命名路由優勢:通過名稱(如 name="user")引用路由,路徑變更時只需更新路由配置,導航代碼無需修改。

3.2 簡化復雜路徑的引用

  • 長路徑問題:多層嵌套的路徑(如 /admin/dashboard/settings/profile)直接硬編碼會降低可讀性。
  • 命名路由優勢:通過名稱(如 name="admin-profile")簡化引用,代碼更清晰。

3.3 動態路徑參數的類型安全

  • 問題:直接拼接路徑參數(如 to="/user/" + userId)容易因參數缺失導致錯誤。
  • 命名路由優勢:強制要求傳遞所有必要的 params,減少運行時錯誤。

3.4 跨模塊路由復用

  • 大型應用場景:不同模塊可能需要跳轉到同一頁面,但路徑結構可能不同(如 /:lang/user/:id vs /user/:id)。
  • 命名路由優勢:通過統一名稱(如 name="user")在不同模塊間復用路由,無需關心具體路徑。

3.5 提高代碼可讀性

  • 語義化命名:名稱(如 name="login")比路徑(如 /auth/sign-in)更直觀,尤其在多人協作的項目中。
  • IDE 支持:IDE 可通過名稱快速定位路由定義,提高開發效率。

4. 解決方案

命名路由的核心價值在于 解耦導航邏輯與 URL 結構,使代碼更易于維護和擴展。在大型應用或路徑頻繁變更的場景下,Vue Router 的命名路由提供了顯著優勢,而 React Router 則通過聲明式路徑匹配保持了更直接的 URL 與組件關系。

4.1 使用自定義常量管理路徑(推薦)

// routes.js
const PRODUCTS = '/products'
export const PATHS = {HOME: '/',PRODUCTS,PRODUCT_DETAIL: `${PRODUCTS}/:id`,
};// App.js
import { PATHS } from './routes';<Routes><Route path={PATHS.HOME} element={<Home />} /><Route path={PATHS.PRODUCTS} element={<Products />} />
</Routes>// 導航時
<Link to={PATHS.PRODUCTS} />

4.2 使用三方庫

如果確實需要命名路由,可以引入第三方庫,例如 react-router-named-routes

npm install react-router-named-routes

需要注意的是,三方庫對 react-router-dom 的要求。

注:文章部分內容是通過與AI對話整理而來。

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

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

相關文章

Spring AI 之結構化輸出轉換器

截至 2024 年 2 月 5 日,舊的 OutputParser、BeanOutputParser、ListOutputParser 和 MapOutputParser 類已被棄用,取而代之的是新的 StructuredOutputConverter、BeanOutputConverter、ListOutputConverter 和 MapOutputConverter 實現類。后者可直接替換前者,并提供相同的…

MCP與AI模型的多語言支持:讓人工智能更懂世界

MCP與AI模型的多語言支持:讓人工智能更懂世界 在人工智能(AI)的時代,我們追求的不僅是強大的計算能力,更是讓AI能夠理解并使用不同語言,真正服務全球用戶。而這背后,一個至關重要的技術就是 MCP(Multi-Context Processing,多上下文處理) ——一種旨在優化 AI 模型理…

【MySQL】 數據庫基礎數據類型

一、數據庫簡介 1.什么是數據庫 數據庫&#xff08;Database&#xff09;是一種用于存儲、管理和檢索數據的系統化集合。它允許用戶以結構化的方式存儲大量數據&#xff0c;并通過高效的方式訪問和操作這些數據。數據庫通常由數據庫管理系統&#xff08;DBMS&#xff09;管理&…

NRM:快速切換 npm 鏡像源的管理工具指南

&#x1f680; NRM&#xff1a;快速切換 npm 鏡像源的管理工具指南 &#x1f50d; 什么是 NRM&#xff1f; NRM&#xff08;Npm Registry Manager&#xff09; 是一個用于管理 npm 鏡像源的命令行工具。 它能幫助開發者 ?快速切換 不同的 npm 源&#xff08;如官方源、淘寶源…

基于Java的話劇購票小程序【附源碼】

摘 要 隨著文化產業的蓬勃發展&#xff0c;話劇藝術日益受到大眾喜愛&#xff0c;便捷的購票方式成為觀眾的迫切需求。當前傳統購票渠道存在購票流程繁瑣、信息獲取不及時等問題。本研究致力于開發一款基于 Java 的話劇購票小程序&#xff0c;Java 語言具有跨平臺性、穩定性和…

Pr -- 耳機沒有Pr輸出的聲音

問題 很久沒更新視頻號了&#xff0c;想用pr剪輯一下&#xff0c;結果使用Pr打開后發現耳機沒有Pr輸出的聲音 解決方法 在編輯--首選項-音頻硬件中設置音頻硬件的輸出為當前耳機設備

Leaflet根據坐標畫圓形區域

在做地圖應用時&#xff0c;有時需要根據指定的坐標來畫一個圓形區域&#xff0c;比如簽到打卡類的應用&#xff0c;此時我們可以使用 leaflet.Circle 來在在指定坐標上創建一個圓并添加到的地圖上&#xff0c;其中可以通過 radius 屬性可以指定區域半徑&#xff0c;比如: con…

vue3中使用computed

在 Vue 3 中&#xff0c;computed 是一個非常重要的響應式 API&#xff0c;用于聲明依賴于其他響應式狀態的派生狀態。以下是 computed 的詳細用法&#xff1a; 1. 基本用法 import { ref, computed } from vueexport default {setup() {const firstName ref(張)const lastN…

【iOS】類結構分析

前言 之前我們已經探索得出對象的本質就是一個帶有isa指針的結構體&#xff0c;這篇文章來分析一下類的結構以及類的底層原理。 類的本質 類的本質 我們在main函數中寫入以上代碼&#xff0c;然后利用clang對其進行反編譯&#xff0c;可以得到c文件 可以看到底層使用Class接…

Vanna.AI:解鎖連表查詢的新境界

Vanna.AI&#xff1a;解鎖連表查詢的新境界 在當今數字化時代&#xff0c;數據已成為企業決策的核心驅動力。然而&#xff0c;從海量數據中提取有價值的信息并非易事&#xff0c;尤其是當數據分散在多個表中時&#xff0c;連表查詢成為了數據分析師和開發者的日常挑戰。傳統的…

前端流行框架Vue3教程:24.動態組件

24.動態組件 有些場景會需要在兩個組件間來回切換&#xff0c;比如 Tab 界面 我們準備好A B兩個組件ComponentA ComponentA App.vue代碼如下&#xff1a; <script> import ComponentA from "./components/ComponentA.vue" import ComponentB from "./…

海拔案例分享-實踐活動報名測評小程序

大家好&#xff0c;今天湖南海拔科技想和大家分享一款實踐活動報名測評小程序&#xff0c;客戶是長沙一家專注青少年科創教育的機構&#xff0c;這家機構平時要組織各種科創比賽、培訓課程&#xff0c;隨著學員增多&#xff0c;管理上的問題日益凸顯&#xff1a;每次組織活動&a…

【MySQL】CRUD

CRUD 簡介 CRUD是對數據庫中的記錄進行基本的增刪改查操作 Create&#xff08;創建&#xff09;Retrieve&#xff08;讀取&#xff09;Update&#xff08;更新&#xff09;Delete&#xff08;刪除&#xff09; 一、新增&#xff08;Create&#xff09; 語法&#xff1a; I…

【數據架構04】數據湖架構篇

? 10張高質量數據治理架構圖 無論你是數據架構師、治理專家&#xff0c;還是數字化轉型負責人&#xff0c;這份資料庫都能為你提供體系化參考&#xff0c;高效解決“架構設計難、流程不清、平臺搭建慢”的痛點&#xff01; &#x1f31f;限時推薦&#xff0c;速速收藏&#…

【Java Web】3.SpringBootWeb請求響應

&#x1f4d8;博客主頁&#xff1a;程序員葵安 &#x1faf6;感謝大家點贊&#x1f44d;&#x1f3fb;收藏?評論?&#x1f3fb; 文章目錄 一、請求 1.1 postman 1.2 簡單參數 1.3 實體參數 1.4 數組集合參數 1.5 日期參數 1.6 JSON參數 1.7 路徑參數 二、響應 2…

競爭性學習:無監督世界的智能聚類引擎

一、競爭性學習&#xff1a;無監督聚類的生物啟發范式 1.1 核心原理&#xff1a;神經元的 “適者生存” 競爭性學習模擬生物神經網絡的競爭機制&#xff1a;多個神經元對輸入數據 “競爭響應”&#xff0c;獲勝神經元&#xff08;與輸入最匹配&#xff09;更新權重&#xff0…

docker面試題(5)

Docker安全么 Docker 利用了 Linux 內核中很多安全特性來保證不同容器之間的隔離&#xff0c;并且通過簽名機制來對鏡像進行 驗證。大量生產環境的部署證明&#xff0c;Docker 雖然隔離性無法與虛擬機相比&#xff0c;但仍然具有極高的安全性。 如何清理后臺停止的容器 可以使用…

同為科技 智能PDU產品選型介紹 EN10/I801CI

智能PDU是一種利用信息技術手段&#xff0c;優化電力的分配和使用。隨著數據中心進行虛擬化部署和為提高計算效率而整合設備&#xff0c;平均機架功率密度在持續增長&#xff0c;幾年前&#xff0c;一個普通機柜需要3-4千瓦電力&#xff0c;而現今9-15千瓦甚至更高電力的機柜則…

Aciviti工作流

1. springBoot和activiti整合 pom.xml文件 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"…

golang 對象池sync.Pool的實現

Go語言中sync.Pool通過多級緩存機制實現高效對象復用&#xff0c;其核心設計結合了GMP調度模型特性。以下是實現要點分析&#xff1a; P o o l ∑ p 0 G O M A X P R O C S ( l o c a l P o o l p ) v i c t i m C a c h e Pool \sum_{p0}^{GOMAXPROCS}(localPool_p) vict…