了解一下React Router V4

新的React Router 從 React 汲取了很多思想和理念,它所提供的路由都可以看成是一個組件。

本次升級的主要變更有:

  • 聲明式 Declarative
  • 可組合 Composability

React Router V4 基于 Lerna 管理多個 Repository。在此代碼庫包括:

react-router: React Router 核心
react-router-dom: 用于 DOM 綁定的 React Router
react-router-native: 用于 React Native 的 React Router
react-router-redux: React Router 和 Redux 的集成
react-router-config: 靜態(tài)路由配置幫助助手

在代碼中該引用哪一個

上面有那么多個,我們應(yīng)該在代碼中引入哪一個?
在代碼中我們引入react-router-dom即可,因為react-router-domreact-router多了<BrowserRouter>,<HashRouter>,<Link>,<NavLink>等一些DOM 類組件,直接引入這個比較方便使用。

新的react-router和以前的用法有什么區(qū)別

<Router>

Router是所有路由組件共用的底層接口,一般我們的應(yīng)用并不會使用這個接口,而是使用高級的路由:
<BrowserRouter>
<HashRouter>
<MemoryRouter>
<NativeRouter>
<StaticRouter>

以前的用法可以在<Router>中使用多個<Route>,如下所示:

render((
  <Router>
    <Route path="/" component={App}/>
    <Route path="/repos" component={Repos}/>
    <Route path="/about" component={About}/>
  </Router>
), document.getElementById('app'))

但在最新的版本中,會出如下的錯誤:


<Router>組件下只允許存在一個子元素,將多個<Route>包裹在<div>標(biāo)簽里,修改如下:

render((
    <Router>
        <div>
          <Route path="/" component={App}/>
          <Route path="/repos" component={Repos}/>
          <Route path="/about" component={About}/>
        </div>
    </Router>
), document.getElementById('app'))
<Router>的引入方式

下面的三種方式都可以;

import {BrowserRouter as Router} from 'react-router-dom'
import Router from 'react-router-dom/BrowserRouter'
import { BrowserRouter } from 'react-router-dom'

<Route>

Route組件主要的作用就是當(dāng)匹配路由的path時,渲染某些UI。

有3種方法來渲染內(nèi)容·:

  • < Route component>
    只有在地址匹配的時候React的組件才會被渲染,路由會根據(jù)指定的組件使用React.createElement來創(chuàng)建一個新的React element
    <Route path="/user/:username" component={User}/>
     const User = ({ match }) => {
    return <h1>Hello {match.params.username}!</h1>
    }
    
  • < Route render>
    使用render屬性,你可以選擇傳一個在地址匹配時被調(diào)用的函數(shù),而不會新創(chuàng)建一個像component一樣的React element
    <Route exact path="/topics" render={() => (
         <h3>Please select a topic.</h3>
    )}/>
    
  • < Route children>
    有時候你可能想不管地址是否匹配都渲染一些內(nèi)容,這種情況你可以使用children屬性。它與render屬性的工作方式基本一樣。
     <Route path="aaa" children={() => (
         <h3>hello children</h3>
     )}/>
    

這三種渲染方法都會獲得相同的三個的屬性:

  • match
    match 對象包含了 <Route path> 如何與URL匹配的信息。match 對象包含以下屬性:
    • params -( object 類型)即路徑參數(shù),通過解析URL中動態(tài)的部分獲得的鍵值對。
    • isExact - 當(dāng)為 true 時,整個URL都需要匹配。
    • path -( string 類型)用來做匹配的路徑格式。在需要嵌套 <Route> 的時候用到。
    • url -( string 類型)URL匹配的部分,在需要嵌套 <Link> 的時候會用到。
  • location
    Location 是指你當(dāng)前的位置,下一步打算去的位置,或是你之前所在的位置
  • history

一個例子

更多的用法,待續(xù)......

參考
https://github.com/react-translate-team/react-router-CN
初探 React Router 4.0
http://www.itdecent.cn/p/e3adc9b5f75c
React Router V4 系列專欄(一)
https://github.com/iuap-design/blog/issues/176
React Router v4 入坑指南
http://www.codezhan.com/Front-end/2017/0707/8293.html
http://www.itdecent.cn/p/27ee7df4ccc1

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容