React-Router 4 的新玩意兒

来源:http://www.cnblogs.com/lihuanqing/archive/2017/05/18/6871896.html
-Advertisement-
Play Games

上一個項目用的還是 2.6.1,轉眼的功夫 4.0 都發佈了,API 變化實在有點大,2.X那套東西不頂用了,老老實實重新看一遍文檔,其中有幾點需要註意的,拿出來說一說。 本文只討論針對瀏覽器的應用,使用 react-router-dom(在react-router基礎上封裝了一些高級組件)進行說明 ...


上一個項目用的還是 2.6.1,轉眼的功夫 4.0 都發佈了,API 變化實在有點大,2.X那套東西不頂用了,老老實實重新看一遍文檔,其中有幾點需要註意的,拿出來說一說。

本文只討論針對瀏覽器的應用,使用 react-router-dom(在react-router基礎上封裝了一些高級組件)進行說明。

  1. 關於BrowserRouter

如果按照原來的使用方式,就掉進第一個坑裡了:history不合法。

用 react-router-dom 中的 <HashRouter>組件代替原來的 <Router> 組件就可以了。

這是之前2.X版本處理瀏覽器路由的方式,4.0版本中推薦另一個組件:<BrowserRouter >

換上<BrowserRouter >之後會出現 2 個問題:

如果你不是通過伺服器啟動應用,因為chrome自身的安全機制,在本地環境下根本不能用chrome玩。這個不關鍵,我本地測試換個瀏覽器還不行麽,本地起個伺服器也不麻煩。

關鍵問題,刷新就是404。原因很簡單,BrowserRouter 和 HashRouter 完全不同,前者利用H5的 history 介面,前臺路由就是後臺收到的路由,你點到其他頁面一刷新,得,根本沒這個文件,伺服器也很無辜,到底讓我渲染個啥?後臺也可以簡單的解決這個問題:甭管你請求的啥地址,我先把入口文件扔給你。node處理方式如下(需要express):

app.get('*',(request,response)=>{

  response.sendFile(path.resolve(__dirname,'../index.html'))

})

 

啟動node伺服器,通過本機伺服器訪問,完美解決上面兩個問題。

(<MemoryRouter> 和 <StaticRouter> 分別是非瀏覽器環境和伺服器端渲染用的,在此不做討論。)

  1. BrowserRouter 里可以存在各種標簽。

原來用慣了2.X的同志們,看到新文檔的例子可能會發現這個問題:Router裡邊不是只能有Route麽,怎麼什麼都有。是的,4.0中 Router 里可以存在各種標簽。

  1. 導航連接<NavLink>

看名字就是導航用的,主要用途就是區分激活的狀態,激活時的樣式。之前揉柔在Link里的。

  1. 只渲染第一個匹配的組件<Switch>

一個路由可能同時匹配多個路徑,在<Switch>中,只渲染匹配的第一個,其他的放棄。之前這是Router的預設行為,4.0中為什麼不預設了呢?答:可以將多個Route組合到頁面中。想一想,如果你就是想同時渲染多個組件而不只是第一個呢?很欣慰看到我在2.X中吐槽的問題得到瞭解決。4.0版本給我最大的感覺就是:他讓瀏覽器更靈活的去渲染頁面。

  1. <Route>的渲染方法:

<Route component>

<Route render>

<Route children>

component和之前2.X的方法相同。

render可以傳個函數避免創建新的React element(內聯渲染時使用避免不必要的重載)。

children使用方式與render一致,只不過無論路由是否匹配都會被渲染。

exact屬性為 true需要路由完全匹配時才渲染組件(之前也是預設行為)。

  1. 三個重要對象:history,location,match

在 Route component 中,以 this.props.location 的方式獲取,

在 Route render 中,以 ({ location }) => () 的方式獲取,

在 Route children 中,以 ({ location }) => () 的方式獲取,

History match的獲取方式類似。


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

-Advertisement-
Play Games
更多相關文章
  • 填寫form表單時發現的一個坑啊! 當你之前有填寫過表單,獲取焦點時,input會有一個記錄之前填寫過的文本的下拉列表式的東東,就像這樣:(抱歉醜了點,隱私問題打上了馬賽克) 按理說,這沒什麼問題,很多時候為了方便,也需要它記錄輸入,但是,同時也發現,文本框變成了黃色了!而且當你選擇其中的文本時它依 ...
  • 恢復內容開始 數組排序的話最常用的就是array.sort()這個方法了。 sort()裡面傳入一個方法來比較大小的值; 對象進行比較的話:按照時間排序 還有一種方法是當兩個值相等時,拿另一個參數作為比較值 然後我最近要做的是預設地址排在第一位,之後的按照時間排序 var data = [{name ...
  • 最近在寫手機端,發現了一個問題,就是javascript點擊元素時,在安卓手機上會出現半透明的藍色背景,(經百度,在蘋果手機上會出現半透明的灰色背景),後來通過百度找到瞭解決方案,就是利用CSS3的-webkit-tap-highlight-color屬性來設置,透過屬性名稱就知道這是設置觸摸高亮顏 ...
  • 前言:這是筆者學習之後自己的理解與整理。如果有錯誤或者疑問的地方,請大家指正,我會持續更新! 滑鼠事件 滑鼠事件共10類,包括click、contextmenu(右鍵)、dblclick(雙擊)、mousedown、mouseup、mousemove、mouseover、mouseout、mouse ...
  • 1.本文屬於改進版本哈 自己也是真的菜,一個websocket簡單聊天系統硬被我搞了那麼些天。 看來以後還是得寫更多的代碼。 client.html: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name= ...
  • 可以通過input 和select來創建下拉列表 其中select的創建如下: 通過json來創建js數組 例子: html代碼片段: js代碼片段: 頁面效果顯示: 屬性解釋: 使用 ...
  • 隨著直播越來越火,所在公司也打算製作自己的直播,所以去瞭解了這方面,使用後發現還是有些問題需要記錄的。 經過分析,製作直播應該是分為兩塊來做,即直播與實時評論。這裡先去製作實時評論,等直播ok後,也會將相應心得寫上來。 我們直播採用了阿裡雲,評論採用了融雲。 其實融雲的api還是比較清晰的,只不過w ...
  • Array.isArray 返回true或者false 格式 Array.isArray(obj) Array.isArray([]); // true Array.isArray([1]); // ture Array.isArray(new Array()); // true Array.isA ...
一周排行
    -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 ...