React Router 4是將URL和您的React應用鏈接在一起的理想工具。 React Router是事實上的React路由庫,它是在React之上構建的最受歡迎的項目之一。
本教程介紹了React Router 4,最後一個穩定版本
React Router是事實上的React路由庫,它是在React之上構建的最受歡迎的項目之一。
React的核心是一個非常簡單的庫,它對路由沒有任何要求。
在單頁應用程序中路由是引入一些功能以通過鏈接導航應用程序的方法,這些功能是預期的在普通的Web應用程序中:
- 瀏覽器應該更改URL當您導航到其他屏幕時
- 深層連結應該可以正常工作:如果將瀏覽器指向URL,則應用程序應該重建生成URL時所顯示的視圖。
- 這瀏覽器後退(前進)按鈕應該像預期的那樣工作。
將您的應用程序導航與瀏覽器提供的導航功能一起路由在一起: 這地址欄和導航按鈕。
React Router提供了一種編寫代碼的方式,以便僅當路線與您定義的路線匹配時,它才會顯示您應用程序的某些組件。
安裝
和npm:
npm install react-router-dom
路線類型
React Router提供兩種不同的路由:
BrowserRouter
HashRouter
一個構建經典URL,另一個構建帶有散列的URL:
https://application.com/dashboard /* BrowserRouter */
https://application.com/#/dashboard /* HashRouter */
使用哪種瀏覽器主要取決於您需要支持的瀏覽器。BrowserRouter
使用歷史API,這是相對較新的版本,在IE9及以下版本中不受支持。如果您不必擔心較舊的瀏覽器,則建議這樣做。
成分
與React Router一起使用時,您互動最多的3個組件是:
BrowserRouter
,通常別名為Router
Link
Route
BrowserRouter
包裝所有Route組件。
Link
組件-您可以想像-用於生成到您的路線的鏈接
Route
組件負責顯示或隱藏它們包含的組件。
瀏覽器路由器
這是BrowserRouter組件的簡單示例。您從react-router-dom導入它,並用它包裝所有應用程序:
import React from 'react'
import ReactDOM from 'react-dom'
import { BrowserRouter as Router } from 'react-router-dom'
ReactDOM.render(
<Router>
<div>
<!– –>
</div>
</Router>,
document.getElementById(‘app’)
)
一個BrowserRouter組件只能有一個子元素,因此我們將所有要包裝的內容包裝在一個div
元素。
關聯
鏈接組件用於觸發新路由。您從導入react-router-dom
,然後您可以添加“鏈接”組件以指向不同的路線,to
屬性:
import React from 'react'
import ReactDOM from 'react-dom'
import { BrowserRouter as Router, Link } from 'react-router-dom'
ReactDOM.render(
<Router>
<div>
<aside>
<Link to={/dashboard
}>Dashboard</Link>
<Link to={/about
}>About</Link>
</aside>
<!– –>
</div>
</Router>,
document.getElementById(‘app’)
)
路線
現在,讓我們在上面的代碼片段中添加Route組件,以使事情按我們希望的那樣實際工作:
import React from 'react'
import ReactDOM from 'react-dom'
import { BrowserRouter as Router, Link, Route } from 'react-router-dom'
const Dashboard = () => (
<div>
<h2>Dashboard</h2>
…
</div>
)
const About = () => (
<div>
<h2>About</h2>
…
</div>
)
ReactDOM.render(
<Router>
<div>
<aside>
<Link to={/
}>Dashboard</Link>
<Link to={/about
}>About</Link>
</aside>
<span style="color:#f92672"><</span><span style="color:#a6e22e">main</span><span style="color:#f92672">></span>
<span style="color:#f92672"><</span><span style="color:#a6e22e">Route</span> <span style="color:#a6e22e">exact</span> <span style="color:#a6e22e">path</span><span style="color:#f92672">=</span><span style="color:#e6db74">'/'</span> <span style="color:#a6e22e">component</span><span style="color:#f92672">=</span>{<span style="color:#a6e22e">Dashboard</span>} <span style="color:#f92672">/></span>
<span style="color:#f92672"><</span><span style="color:#a6e22e">Route</span> <span style="color:#a6e22e">path</span><span style="color:#f92672">=</span><span style="color:#e6db74">'/about'</span> <span style="color:#a6e22e">component</span><span style="color:#f92672">=</span>{<span style="color:#a6e22e">About</span>} <span style="color:#f92672">/></span>
<span style="color:#f92672"><</span><span style="color:#960050;background-color:#1e0010">/main></span>
<span style="color:#f92672"><</span><span style="color:#960050;background-color:#1e0010">/div></span>
</Router>,
document.getElementById(‘app’)
)
在Glitch上檢查以下示例:https://glitch.com/edit/#!/flaviocopes-react-router-v4/
路線匹配時/
,應用程序顯示儀表板成分。
通過點擊“關於”鏈接更改路線後,/about
,儀表板組件將被刪除,關於組件已插入DOM中。
注意exact
屬性。沒有這個path="/"
也將匹配/about
, 自從/
包含在路線中。
匹配多個路徑
您可以使用正則表達式使路由響應多個路徑,因為path
可以是一個正則表達式字符串:
<Route path='/(about|who)/' component={Dashboard} />
內聯渲染
而不是指定一個component
財產Route
,您可以設置一個render
支柱:
<Route
path='/(about|who)/'
render={() => (
<div>
<h2>About</h2>
...
</div>
)}
/>
匹配動態路由參數
您已經了解瞭如何使用靜態路由,例如
const Posts = () => (
<div>
<h2>Posts</h2>
...
</div>
)
//…
<Route exact path="/posts" component={Posts} />
這是處理動態路線的方法:
const Post = ({match}) => (
<div>
<h2>Post #{match.params.id}</h2>
...
</div>
)
//…
<Route exact path="/post/:id" component={Post} />
在Route組件中,您可以在以下位置查找動態參數match.params
。
match
內聯渲染路線中也可用,這在這種情況下特別有用,因為我們可以使用id
參數,用於在渲染Post之前在我們的數據源中查找post數據:
const posts = [
{ id: 1, title: 'First', content: 'Hello world!' },
{ id: 2, title: 'Second', content: 'Hello again!' }
]
const Post = ({post}) => (
<div>
<h2>{post.title}</h2>
{post.content}
</div>
)
//…
<Route exact path="/post/:id" render={({match}) => (
<Post post={posts.find(p => p.id === match.params.id)} />
)} />
免費下載我的反應手冊
更多反應教程:
- 一個React簡單的應用示例:通過API獲取GitHub用戶信息
- 用React構建一個簡單的計數器
- 用於React開發的VS Code設置
- 如何通過React Router將道具傳遞給子組件
- 使用Electron和React創建一個應用
- 教程:使用React創建電子表格
- 學習React的路線圖
- 了解如何使用Redux
- JSX入門
- 樣式化的組件
- Redux Saga簡介
- React Router簡介
- React簡介
- 反應組件
- 虛擬DOM
- 反應事件
- 反應狀態
- 反應道具
- 反應片段
- React Context API
- 反應PropTypes
- 反應概念:聲明式
- React:如何在點擊時顯示其他組件
- 如何在React JSX內部循環
- 道具與狀態在React中
- 您應該使用jQuery還是React?
- 使用React需要知道多少JavaScript?
- 蓋茨比介紹
- 如何在React中引用DOM元素
- React中的單向數據流
- 反應高階組件
- 反應生命週期事件
- 反應概念:不變性
- 反應概念:純度
- React鉤子簡介
- create-react-app簡介
- 反應概念:組成
- React:演示組件與容器組件
- React中的代碼拆分
- 使用React進行服務器端渲染
- 如何安裝React
- React中的CSS
- 在React中使用SASS
- 在React中處理表單
- 反應嚴格模式
- 反應門戶
- 反應渲染道具
- 測試React組件
- 如何在React中將參數傳遞給事件處理程序
- 如何處理React中的錯誤
- 如何在JSX中返回多個元素
- React中的條件渲染
- 反應,如何將道具轉移到子組件
- 如何在React中獲取輸入元素的值
- 如何使用useState React鉤子
- 如何使用useCallback React鉤子
- 如何使用useEffect React鉤子
- 如何使用useMemo React鉤子
- 如何使用useRef React鉤子
- 如何使用useContext React鉤子
- 如何使用useReducer React鉤子
- 如何將您的React應用程序連接到相同來源的後端
- 到達路由器教程
- 如何使用React Developer Tools
- 如何學習React
- 如何調試React應用程序
- 如何在React中呈現HTML
- 如何修復`dangerouslySetInnerHTML`與React中的錯誤不匹配
- 我如何解決React登錄表單狀態和瀏覽器自動填充的問題
- 如何在本地主機上的React應用程序中配置HTTPS
- 如何修復React中的“在渲染其他組件時無法更新組件”錯誤
- 我可以在條件內使用React掛鉤嗎?
- 將useState與對像一起使用:如何更新
- 如何使用React和Tailwind在代碼塊中移動
- React,添加到DOM時將焦點放在React中的一個項目上
- 反應,在doubleclick上編輯文本