[React]使用React Router建立SPA

  • 5386
  • 0
  • 2016-03-05

摘要:[React]使用React Router建立SPA

 

要建立SPA(Single Page Application)的程式,首先需要一個Router機制,用來處理頁面的切換。React官方沒有提供Router機制,所以就有人寫了一個Library以提供Router的功能,也就是要介紹的這一個Package: react-router

 

簡單的Routing Configuration


react-router的概念跟ASP.NET MVC中的概念很像,就是使用一個Routing Configuration來定義網址與處理頁面(React中對應的概念就是處理該網址的React Component)。

一個簡單的Routing Configuration會長這個樣子

// declare our routes and their hierarchy
var routes = (
  <Route>
    <Route path="PageA" handler={About}/>
    <Route path="PageB" handler={Inbox}/>
  </Route>
);

其中path是指巡覽的網址,handler是指處理該網址需求的React Component

在這種簡單的設定之下,可以用網址簡單的切換不同頁面。如下圖所示

 

Master Page的Routing Configuration設定


而較為複雜一點的頁面,會有Master Page的結構。也就是最外層有一個固定的主頁面,裡面包含著一個Container,再依據不同的網址切換Container的內容。這種結構下的Routing Configuration會類似底下的Example:

var routes = (
  <Route handler={App} path="/">
    <DefaultRoute handler={Home} />
    <Route name="about" handler={About} />
    <Route name="users" handler={Users}>
      <Route name="recent-users" path="recent" handler={RecentUsers} />
      <Route name="user" path="/user/:userId" handler={User} />
      <NotFoundRoute handler={UserRouteNotFound}/>
    </Route>
    <NotFoundRoute handler={NotFound}/>
  </Route>
);

可以看到最外層有一個Route,包著內層Route,以及DefaultRoute, NotFoundRoute等React Component。 這也就是說,外層Route所定義的handler => App是作為Master Page之用。若網址加上about,則會切換內層的元件為About這個handler。若網址沒有加上任何的參數,則會採用DefaultRoute的設定,使用Home這個handler。若網址後加入的參數,是沒有設定在Route Configuration中的,則會採用NotFoundRoute的設定,使用UserRouteNotFound這個handler

App這個React Component作為Master Page,其實作法很簡單。檢視其程式碼(如下)可以發現,有一個React Component-RouteHandler,就是用來處理內層Route之用。

var RouteHandler = Router.RouteHandler;

var App = React.createClass({
  render () {
    return (
      <div>
        <h1>App</h1>
        <RouteHandler/>
      </div>
    )
  }
});

 

完整的Routing宣告及設定


要順序的使用react-routing,就需要完整的宣告及設定react-routing 的 React Component。這包含了幾個部分

  • React Component宣告

包含了基本的Router物件,以及相關連的子物件。

var Router = require('react-router');
var Route = Router.Route;
var NotFoundRoute = Router.NotFoundRoute;
var DefaultRoute = Router.DefaultRoute;
var RouteHandler = Router.RouteHandler;
var Link = Router.Link;

 

  • Routing Configuration

Routing Configuration是用來設定處理不同網址的React Component

var routes = (
	<Route path='/' handler={App}>
		<Route name="A" path="PageA" handler={PageA}/>
		<Route name="B" path="PageB" handler={PageB}/>
		<Route name="C" path="PageC" handler={PageC}/>
		<NotFoundRoute handler={NotFound} />
		<DefaultRoute  handler={HelloMessage}/>
    </Route>
	);

 

  • Router Run

最後要把react-router套用在React的virtual DOM的處理上

Router.run(routes, Router.HashLocation, function(Root) {
    React.render(<Root/>, document.getElementById('app'));
});

 

設定連結-切換頁面


設定好react-router之後,接下來就要知道如何套用這個機制來進行切換頁面。基本上,切換頁面最直接的方式,就是使用<a></a>標籤,在href屬性中設定連結的網址就可以了。react-router也提供了Link這個React Component,不同於<a></a>標籤,需要設定to屬性,該屬性要指定的是Route的name。基本上,Link這個React Component最後也是轉換成<a></a>標籤。

 

以上的方式是直接設定在標籤中,如果想透過程式動態的換頁,那麼react-router也提供了mixins的function - transitionTo()以供使用。一個使用以上三種方式的Example如下所示:

var App = React.createClass({
  mixins: [Navigation],
  transitionToPageC: function(){
    this.transitionTo('/PageC');
  },
  render: function() {
    return (
      <div>
        <h1>App</h1>
        <a href="#PageA">Page A</a>
        <Link to='B'>Page B</Link>
        <input type='button' onClick={this.transitionToPageC} value='Page C'></input>
        <hr/>
        <RouteHandler/>
      </div>
    )
  }
});

 

寫好一個簡單的範例程式碼放在GitHub=>這裡。這篇筆記只是簡單的介紹react-router的使用方式,若需要更詳盡的資訊,請參考官方說明文件