UEQareer Advent Calendar 2017、 21日目のエントリーです。
今回はReactのライブラリreact-routerを使って、GitHubなどの静的ページでもルーティングをしてみるという内容です。react-routerはv4を使っています。
全体のコードはここで見ることができます。
react-router API
react-routerにはAPIがたくさんありますが、その中でもよく利用するのはBrowserRouterやStaticRouterではないでしょうか。BrowserRouterはブラウザ上でのルーティング時に、StaticRouterはサーバーサイドレンダリング時に使われます。
import { BrowserRouter, Route Switch, } from 'react-router'; <BrowserRouter> <Switch> <Route exact path="/about" component={AboutComponent} /> <Route path="/" component={IndexComponent} /> </Switch> </BrowserRouter>
import { StaticRouter, Route Switch, } from 'react-router'; <StaticRouter location={url} context={context}> <Switch> <Route exact path="/about" component={AboutComponent} /> <Route path="/" component={IndexComponent} /> </Switch> </StaticRouter>
HashRouter
上記APIのほかに、react-routerにはHashRouterというものが存在します。静的ページでルーティングするにはこのHashRouterを使います。
import { HashRouter, Route Switch, } from 'react-router'; <HashRouter> <Switch> <Route exact path="/about" component={AboutComponent} /> <Route path="/" component={IndexComponent} /> </Switch> </HashRouter>
このようにRouteを設定するとindexページのurlは/#/、aboutページのurlは/#/aboutとなります。コード自体はBrowserRouterと同じように書けるのでとくに迷うことはありません。
hashType
デフォルトでは/#/pageのようにurlに含まれるハッシュの直後にスラッシュが入ります。hashTypeを指定することでハッシュタイプを変更することもできます。
/* indexページ -> /#/ aboutページ -> /#/about */ <HashRouter hashType="slash"> <App /> </HashRouter>
/* indexページ -> /# aboutページ -> /#about */ <HashRouter hashType="noslash"> <App /> </HashRouter>
/* indexページ -> /#! aboutページ -> /#!/about */ <HashRouter hashType="hashbang"> <App /> </HashRouter>
注意
HashRouterはlocation.keyとlocation.stateをサポートしていません。そのため、location.keyなどを使用しない環境下でのみHashRouterが使えます。通常はBrowserRouterを使うので問題なとは思いますが、HashRouterを使う時には注意が必要です。
さいごに
これでGitHubのような静的ページでもreact-routerのHashRouterを使ってルーティングができるようになりました。