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
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...