官方文檔:https://react-guide.github.io/react-router-cn/docs/guides/advanced/NavigatingOutsideOfComponents.html (強烈推薦)
react-router入門可以看阮一峰老師的文章: http://www.ruanyifeng.com/blog/2016/05/react_router.html
react-router現在是4.x版本,但是3.x版本的react-router用的比較多一些,阮一峰老師所講解的也是3.x版本,通過npm安裝需要制定版本号,如 npm install [email protected] --save 。
和vue-router非常類似, react-router實作單頁面應用的方式也是用 hash 的變化來切換頁面。同樣地,react-router也是使用Router和Router來管理路由。同時配置設定了Link來點選路由,實際上就是一個a标簽。
基本使用方式如下:
其中,我們可以引入Router,作為一個容器,管理所有的路由,接着引入Route, 用來真正地定義路由,最後使用hashHistory是說通過路由的切換由URL的hash變化決定,即URL的<code>#</code>部分發生變化。舉例來說,使用者通路<code>http://www.example.com/</code>,實際會看到的是<code>http://www.example.com/#/</code>。 一般在vue中也是使用這種方式的,當然,在vue中我們也可以不用#來切換,但是這需要後端的配合。
對于比較簡單的React路由,通過下面這種方法就足夠了:
但是對于複雜的路由,通常會用到嵌套路由:
但是這是App的寫法就發生了變化,需要我們寫為下面的形式:
App 元件的寫法如下:
而其中的path屬性就是制定具體的url。 而後的component制定在目前的path下使用的元件。
react-router是建立在 history 之上的。 簡而言之,一個 history 知道如何去監聽浏覽器位址欄的變化, 并解析這個 URL 轉化為 <code>location</code> 對象, 然後 router 使用它比對到路由,最後正确地渲染對應的元件。
常用的 history 有三種形式, 但是你也可以使用 React Router 實作自定義的 history。
browserHistory
hashHistory
createMemoryHistory
一般我們推薦的是browserHistory,即和hashHistory不同,他不會出現 # 的情況,看上去更加美觀一些。
但是使用這種方法,需要後端進行配合,如node端使用下面的方法,否則在重新整理的時候會出現問題:
React Router 提供一個 <code>routerWillLeave</code> 生命周期鈎子,這使得 React 元件可以攔截正在發生的跳轉,或在離開 route 前提示使用者。<code>routerWillLeave</code> 傳回值有以下兩種:
<code>return false</code> 取消此次跳轉
<code>return</code> 傳回提示資訊,在離開 route 前提示使用者進行确認。
你可以在 route 元件 中引入 <code>Lifecycle</code> mixin 來安裝這個鈎子。
使用這種方式可以使用鈎子函數,那麼使用 React.Component的方式應該也是可以的。
但是在實際使用過程中還是遇到了問題,沒有成功。 可以取代他的方法是使用 e.preventDefault() 來阻止預設。
如下所示:
傳遞:
<Link to={{ pathname: '/log', query: { type: 'login' } }} >登入</Link>
擷取:
if ( this.props.location.query.type == 'login') {
this.setState({ifUp: true});
}