react-router的簡單使用

来源:https://www.cnblogs.com/Mrfanl/archive/2018/12/03/10039322.html
-Advertisement-
Play Games

React Router是一個基於React之上的強大路由庫,可以讓你嚮應用中快速的添加視圖和數據流,同時保持頁面與URL間的同步。 1.安裝: 2.問題說明: 剛開始的時候由於沒有註意到版本信息,導致出現了一些錯誤,現在記錄如下: 這是我package.js中的版本信息, 說明1:react-ro ...


 

  React Router是一個基於React之上的強大路由庫,可以讓你嚮應用中快速的添加視圖和數據流,同時保持頁面與URL間的同步。

1.安裝: 

npm install --save react-router

 2.問題說明:

     剛開始的時候由於沒有註意到版本信息,導致出現了一些錯誤,現在記錄如下:

    

  這是我package.js中的版本信息,

  說明1:react-router的2.x版本和4.x版本不相容,預設下載的4.x的版本,我這裡選擇的是2.x版本不然會報 “

        TypeError: Cannot read property 'location' of undefined”

    說明2:react 16和react-router2.x的版本不相容,會報“TypeError: Cannot read property 'func' of undefined”,我這裡講react降級到了15

 

 3.路由配置:

    (1)路由配置是一組指令,用來告訴router如何匹配URL

React.render((
    <Router>
        <Route path="/" component={App}>
            <Route path="about" component={About}>
            <Route path="inbox" component={Message}>
        </Route >
    </Router>     
),doucument.body);

  其中<Route>中指定路徑path 和 需要顯示的組件component相匹配,並且Route之間允許嵌套,如上:About組件的路徑就是“/about”。

     (2)<IndexRoute>組件放在可以添加首頁效果 ,在還未點擊about,或者inbox時,自動顯示在頁面上,即類似在當請求的的URL匹配某個目錄時,允許你指定一個類似index.html的入口文件。

ReactDOM.render(
  <Router>
  <Route path="/" component={App}>
    <IndexRoute component={DashBoard}/>
    <Route path="about" component={About}/>
    <Route path="inbox" component={Inbox}>
      <Route path="message/:id" component={Message}/>
    </Route>
  </Route>
  </Router>
  , document.getElementById('root'));

顯示效果如下:

 

URL路徑與組件的聯繫如下:

如果在<Route>中將Message的路徑改為絕對路徑,如“/messages/:id”,

則最後一個URL與路徑的匹配改為:/messages/:id-》app->Inbox->Message

 

   (3)上面一條的最後我們改了URL,這使得舊的URL會出現錯誤界面,這時,我們可以通過<Redirect>這個組件使得原來的URL也可以正常工作。

ReactDOM.render(
  <Router>
  <Route path="/" component={App}>
    <IndexRoute component={DashBoard}/>
    <Route path="about" component={About}/>
    <Route path="inbox" component={Inbox}>
      <Route path="/message/:id" component={Message}/>
      <Redirect from="message/:id" to="/message/:id"/>
    </Route>
  </Route>
  </Router>
  , document.getElementById('root'));

 

(4)路由匹配的原理

       三個屬性來決定是否匹配一個URL:

  • 嵌套關係

  嵌套路由被描述成一個樹形結構,並且通過深度優先遍歷尋找一個與給定URL相匹配的路由。

  • 路徑語法

     路由路徑是匹配一個(或一部分)URL 的 一個字元模式串。大部分的路由路徑都可以直接按照字面量理解,除了幾個特殊的符號:

    :paramName – 匹配一段位於 /? 或 # 之後的 URL。 命中的部分將被作為一個參數

    () – 在它內部的內容被認為是可選的

    * – 匹配任意字元(非貪婪的)直到命中下一個字元或者整個 URL 的末尾,並創建一  個 splat參數

  • 優先順序

     路由演算法會根據定義的順序自頂向下匹配路由。因此,當你擁有兩個兄弟路由節點配置時,你必須確認前一個路由不會匹配後一個路由中的路徑

 

4.Histories

   React Router 是建立在 還是history之上的。 簡而言之,一個 history 知道如何去監聽瀏覽器地址欄的變化, 並解析這個 URL 轉化為 location 對象, 然後 router 使用它匹配到路由,最後正確地渲染對應的組件。

  (下麵介紹一下history)

----------------------------------------分割線---------------------------------

         history是一個JavaScript庫,它允許您在JavaScript運行的任何地方輕鬆管理會話歷史。history抽象了不同環境中的差異,並提供了一個最小的API,允許您管理歷史堆棧、導航、確認導航和會話之間的持久狀態。

         history提供三種不同的方法去創建一個history對象,這取決於你的環境

        createBrowserHistory,createMemoryHistory,createHashHistory

        我們主要運用到createBrowserHistory,下麵以這個為例子:

 

 const history = createBrowserHistory();
const location = history.location;
    const unlisten = history.listen((location, action) => {
  
  console.log(location);
     });
     history.push("/about",{some:"state"});
     unlisten();

     輸出的location對象為:

   

其中的pathname項就是當前url的地址。

有關history更多的信息,可以參考:https://github.com/ReactTraining/history

-----------------------------又是一條分割線--------------------------------------------------------

在React Router中可以引入browserHistory

import { browserHistory } from 'react-router';

ReactDOM.render(
  <Router history={browserHistory}>
  <Route path="/" component={App}>
    <IndexRoute component={DashBoard}/>
    <Route path="about" component={About}/>
    <Route path="inbox" component={Inbox}>
      <Route path="/message/:id" component={Message}/>
      <Redirect from="message/:id" to="/message/:id"/>
    </Route>

  </Route>
  </Router>
  , document.getElementById('root'));

這樣地址欄的地址會變為:

沒有了奇怪的/#/

 

 

 

 

              

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 力有不逮的對象 眾所周知,在 中,直接修改對象屬性的值無法觸發響應式。當你直接修改了對象屬性的值,你會發現,只有數據改了,但是頁面內容並沒有改變。 這是什麼原因? 原因在於: 的響應式系統是基於 這個方法的,該方法可以監聽對象中某個元素的獲取或修改,經過了該方法處理的數據,我們稱其為響應式數據。但是 ...
  • 聲明 本系列文章內容全部梳理自以下幾個來源: 《JavaScript權威指南》 "MDN web docs" "Github:smyhvae/web" "Github:goddyZhao/Translation/JavaScript" 作為一個前端小白,入門跟著這幾個來源學習,感謝作者的分享,在其基 ...
  • 方法一:footer高度固定+絕對定位 HTML代碼: CSS代碼: 實現的效果: 首先,設置body的高度至少充滿整個屏幕,並且body作為footer絕對定位的參考節點; 其次,設置main(footer前一個兄弟元素)的padding-bottom值大於等於footer的height值,以保證 ...
  • 學習Vue的一些總結,第一次寫博客,文筆實在是很差 不過我會不斷寫的。 這裡只寫了一部分常用的vue的指令,後面還會有的。 ...
  • 12.3事件對象 1.每個元素身上的事件都是天生自帶的,不需要我們去定義,只需要我們給這個事件綁定一個方法, 2.事件綁定的寫法 1.div.onclick=function(){} DOM 0級事件綁定 2.div.addEventListener()或div.attachEvent() DOM2 ...
  • 內置類型 JS 中分為七種內置類型,七種內置類型又分為兩大類型:基本類型和對象(Object)。 基本類型有六種: ,`undefined boolean number string symbol`。 其中 JS 的數字類型是浮點類型的,沒有整型。並且浮點類型基於 IEEE 754標準實現,在使用中 ...
  • 參考資料:CSDN-真實的上傳進度條 ...
  • 聲明 本系列文章內容全部梳理自以下幾個來源: 《JavaScript權威指南》 "MDN web docs" "Github:smyhvae/web" "Github:goddyZhao/Translation/JavaScript" 作為一個前端小白,入門跟著這幾個來源學習,感謝作者的分享,在其基 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...