React Router v4教程:爲你的 React 應用創建路由

翻譯:瘋狂的技術宅
原文:https://www.edureka.co/blog/r...

本文首發微信公衆號:前端先鋒
歡迎關注,每天都給你推送新鮮的前端技術文章


在這篇關於 React Router 的博文中,我將引導你搞懂 React 中路由的概念。

你將看到以下主題:

  • 常規路由
  • 爲什麼需要 React 路由?
  • React 中的路由
  • React Router v4 的優點

常規路由

通常,當用戶在瀏覽器中鍵入 URL 時,會向服務器發送 HTTP 請求,然後服務器檢索 HTML 頁面。對於每個新URL,用戶會被重定向到的 HTML 頁面。你可以通過參考下圖來更好地理解路由的工作原理。

clipboard.png

爲什麼需要 React 路由?

將單頁應用限制爲單一視圖並不適用於 Facebook、Instagram 等流行的社交媒體網站,這些網站現在使用 React 呈現多個視圖。我們需要繼續前進,學習如何在單頁面應用中顯示多個視圖

例如我們習慣看到顯示歡迎消息和相關內容的主頁。網站介紹的詳細信息可以在“關於我們”頁面上找到,用戶列表及其詳細信息會出現在不同的頁面上,可能還有其他各種頁面包含很多不同的視圖。

那麼你認爲這是怎樣實現的呢? 在程序中添加路由器可以解決這一需求。

React 中的路由

這將把我們帶到本文的主題:React Router v4。 2017年3月13日,Micheal Jackson 和 Ryan Florence 發佈了React Router v4 及可靠的文檔。

他們相信“Learn Once, Route Anywhere”的理念。

在 React Conf 2017 的演講中,他們通過展示如何將路由概念無縫地從 Web 平臺投射到 Native 平臺,以及將 React Router 集成到 VR 並在 React Native 中創建動畫來解釋這一點。雖然他們的談話中的着眼點是圍繞路由器 API 是如何“All About Components”的。

在React中,只涉及單個 “Html” 文件。每當用戶輸入新的 URL 請求時,路由不會從服務器獲取數據,而是爲每個新的 URL 請求交換不同的 Component。用戶看上去是在多個頁面之間進行切換,但實際上,根據我們的需要實現了多個視圖,每個單獨的組件被重新渲染

React 是如何實現這一目標的?

這就是'History'的概念出現在圖片中的地方。在 React 中,路由查看每個組件的歷史記錄,當歷史記錄發生任何變化時,組件會重新渲染。在 Router v4 之前,我們必須手動設置 History 的值。但是,從Router v4開始,<BrowserRouter>繞過了基本路徑,爲我們減少了大量的工作。如果你仍然需要訪問歷史記錄,HTML5 提供了一個內置的 API,允許我們通過 pushStatereplaceState 方法修改 History 對象。

實際上,React Router 4 完全重寫了之前的版本。創建自己的路由只是你已經精通的 React Components 後的自然擴展。雖然學習它需要花費一些時間,但是一旦你繼續前進,Router v4 將變得更有意義。

React Router v4 的優點

本質上我們是想在 React 的 render 方法中調用 Router Component。這是因爲整個 Router API 都是關於組件的。當然,每個 Component 的角色都是像所有 React 應用一樣呈現UI。

1. 無需手動設置歷史記錄

我們只需將自己的 Router App Component 包裝在 <BrowserRouter> 中。

ReactDOM.render((
  <BrowserRouter>
      <App/>
  </BrowserRouter>
), document.getElementById(“root”));

現在讓我們通過一個例子來理解路由:

我們將創建三個頁面。這是頁面列表及其對應的地址。

Page Address
Home ‘/’
About ‘/about’
Topic ‘/topic’

2. 包拆分:

react-router 庫現在被分爲三個獨立的包。

  • react-router-dom:專爲 Web 應用而設計。
  • react-router-native:專爲移動應用而設計。
  • react-router-core:可以用於核心應用的任何地方。

我們需要安裝依賴項:

$ npm install --save react-router-dom

(如果你沒有安裝最新的npm(5.x)版本,請使用 save 命令。)

react-router-dom 庫中導入 BrowserRouter 以及 LinkRoute

可以將 BrowserRouter 可視化爲呈現子路徑的根組件。

import {
  BrowserRouter,
  Route,
  Link
} from 'react-router-dom'

接下來讓我們瞭解 LinkRoute 組件,然後再繼續瞭解 Router v4 的優勢。

Link

Link 用於在程序中的內部路由之間導航。它相當於錨標籤:<a> </a>

Link 傳遞一個字符串參數 to,其中指定了 URL 的路徑。

<ul>
  <li><Link to="/">Home</Link></li>
  <li><Link to="/about">About</Link></li>
  <li><Link to="/topics">Topics</Link></li>
</ul>

Route

現在看一下 <Route>,它可以被視爲負責重新渲染 UI 的單一子組件。如果用戶指定的位置與 <Route> 中定義的路徑匹配,則 <Route> 可以通過兩種方式定義視圖

  1. 創建 <Route> 中指定的 Component
  2. 使用內聯 render 函數

如果指定的URL與定義的路徑不匹配,<Route> 將返回 null。 <Route> 有兩個參數,一個用於路徑,另一個用於渲染 UI

<BrowserRouter>
  <div>
    <Route exact path="/" render={ ( ) => (<h2> HomePage </h2>) } />
    <Route path="/about" component={About}/>
    <Route path="/topics" component={Topics}/>
  </div>
</BrowserRouter>

3. 用 exact 取代 IndexRoute:

無需使用 IndexRoute 呈現 HomePage,你會注意到前面代碼片段中的 exact 屬性。這是 React Router v4 聲明 性質的一個的例子。

v4 中的路由爲 inclusive 意味着可以同時呈現多個路由。我們使用 exact 屬性來解決多匹配中的問題。

在前面的例子中沒有使用 exact,URL '/' 將匹配路徑 '/'、'/about' 和 '/topics'。但是我們希望 '/' 僅匹配我們的渲染函數,因此使用 exact 明確地實現了這一點。

4. 路由只能有一個單一子元素:

這就是我們需要在 <div> 中包裝路由的原因。如果不這樣做,你會得到以下異常。

Uncaught Error: A <Router> may have only one child element

5. Switch:

雖然我們可以在一個 <div> 標籤中封裝幾個路由。如果我們希望一次只渲染一個路徑組件,可以使用 <switch> 標籤。它按順序檢查每個路徑的匹配並在找到第一個匹配後停止。

<switch>
  <route exact path=’/’   component={Home}/>
  <route path=’/users/:id’ component={User }/>
  <route path=’/users’   component={Roster}/>
<switch>

在示例中,我們將路徑 /users/:id 放置在 /users 前面。這是因爲 users/:id 將匹配 /users/users/:id

現在你已經對 React Router 有了基本的瞭解,下面是定義我們的 Router App Component 的完整代碼。

const App= () => (
  <BrowserRouter>
    <div>
    <ul>
      <li><Link to="/">Home</Link></li>
      <li><Link to="/about">About</Link></li>
      <li><Link to="/topics">Topics</Link></li>
    </ul>
    <Route exact path="/" render={ ( ) => (<h2> HomePage </h2>) } />
    <Route path="/about" component={About}/>
    <Route path="/topics" component={Topics}/>
    </div>
  </BrowserRouter>
)

本文首發微信公衆號:前端先鋒

歡迎掃描二維碼關注公衆號,每天都給你推送新鮮的前端技術文章

歡迎掃描二維碼關注公衆號,每天都給你推送新鮮的前端技術文章


歡迎繼續閱讀本專欄其它高贊文章:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章