UNPKG

webappengine

Version:

A web application platform that can host multiple web apps running with Node.js.

531 lines (484 loc) 89.2 kB
<!doctype html><html lang="en"><head><meta charset="utf-8"><title>React Router Documentation</title><link rel="stylesheet" href="./styles.css"><link rel="stylesheet" href="./syntax.css"></head><body><main class="Main"><div class="Main__Content"><center><img src="./img/vertical.png" width="367" style="margin-bottom:40px;"></center><p>React Router is a complete routing solution designed specifically for <a href="https://facebook.github.io/react">React.js</a>. It painlessly synchronizes the components of your application with the URL, with first-class support for nesting, transitions, and server side rendering.</p><p><a href="https://github.com/rackt/react-router">Contribute on Github.</a></p><section><article class="Doc"><h1 class="Heading" id="Router Overview"><a class="HeadingLink" href="#Router Overview">Router Overview</a><span class="CategoryName">Guides</span></h1><div><p>To illustrate the problems React Router is going to solve for you, let’s build a small application without it.</p> <h2 id="without-react-router">Without React Router</h2> <pre><code class="lang-js"><div class="highlight"><pre><span class="kd">var</span> <span class="nx">About</span> <span class="o">=</span> <span class="nx">React</span><span class="p">.</span><span class="nx">createClass</span><span class="p">({</span> <span class="nx">render</span><span class="o">:</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span> <span class="k">return</span> <span class="o">&lt;</span><span class="nx">h2</span><span class="o">&gt;</span><span class="nx">About</span><span class="o">&lt;</span><span class="err">/h2&gt;;</span> <span class="p">}</span> <span class="p">});</span> <span class="kd">var</span> <span class="nx">Inbox</span> <span class="o">=</span> <span class="nx">React</span><span class="p">.</span><span class="nx">createClass</span><span class="p">({</span> <span class="nx">render</span><span class="o">:</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span> <span class="k">return</span> <span class="o">&lt;</span><span class="nx">h2</span><span class="o">&gt;</span><span class="nx">Inbox</span><span class="o">&lt;</span><span class="err">/h2&gt;;</span> <span class="p">}</span> <span class="p">});</span> <span class="kd">var</span> <span class="nx">Home</span> <span class="o">=</span> <span class="nx">React</span><span class="p">.</span><span class="nx">createClass</span><span class="p">({</span> <span class="nx">render</span><span class="o">:</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span> <span class="k">return</span> <span class="o">&lt;</span><span class="nx">h2</span><span class="o">&gt;</span><span class="nx">Home</span><span class="o">&lt;</span><span class="err">/h2&gt;;</span> <span class="p">}</span> <span class="p">});</span> <span class="kd">var</span> <span class="nx">App</span> <span class="o">=</span> <span class="nx">React</span><span class="p">.</span><span class="nx">createClass</span><span class="p">({</span> <span class="nx">render</span> <span class="p">()</span> <span class="p">{</span> <span class="kd">var</span> <span class="nx">Child</span><span class="p">;</span> <span class="k">switch</span> <span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">props</span><span class="p">.</span><span class="nx">route</span><span class="p">)</span> <span class="p">{</span> <span class="k">case</span> <span class="s1">&#39;about&#39;</span><span class="o">:</span> <span class="nx">Child</span> <span class="o">=</span> <span class="nx">About</span><span class="p">;</span> <span class="k">break</span><span class="p">;</span> <span class="k">case</span> <span class="s1">&#39;inbox&#39;</span><span class="o">:</span> <span class="nx">Child</span> <span class="o">=</span> <span class="nx">Inbox</span><span class="p">;</span> <span class="k">break</span><span class="p">;</span> <span class="k">default</span><span class="o">:</span> <span class="nx">Child</span> <span class="o">=</span> <span class="nx">Home</span><span class="p">;</span> <span class="p">}</span> <span class="k">return</span> <span class="p">(</span> <span class="o">&lt;</span><span class="nx">div</span><span class="o">&gt;</span> <span class="o">&lt;</span><span class="nx">h1</span><span class="o">&gt;</span><span class="nx">App</span><span class="o">&lt;</span><span class="err">/h1&gt;</span> <span class="o">&lt;</span><span class="nx">Child</span><span class="o">/&gt;</span> <span class="o">&lt;</span><span class="err">/div&gt;</span> <span class="p">)</span> <span class="p">}</span> <span class="p">});</span> <span class="kd">function</span> <span class="nx">render</span> <span class="p">()</span> <span class="p">{</span> <span class="kd">var</span> <span class="nx">route</span> <span class="o">=</span> <span class="nb">window</span><span class="p">.</span><span class="nx">location</span><span class="p">.</span><span class="nx">hash</span><span class="p">.</span><span class="nx">substr</span><span class="p">(</span><span class="mi">1</span><span class="p">);</span> <span class="nx">React</span><span class="p">.</span><span class="nx">render</span><span class="p">(</span><span class="o">&lt;</span><span class="nx">App</span> <span class="nx">route</span><span class="o">=</span><span class="p">{</span><span class="nx">route</span><span class="p">}</span> <span class="o">/&gt;</span><span class="p">,</span> <span class="nb">document</span><span class="p">.</span><span class="nx">body</span><span class="p">);</span> <span class="p">}</span> <span class="nb">window</span><span class="p">.</span><span class="nx">addEventListener</span><span class="p">(</span><span class="s1">&#39;hashchange&#39;</span><span class="p">,</span> <span class="nx">render</span><span class="p">);</span> <span class="nx">render</span><span class="p">();</span> <span class="c1">// render initially</span> </pre></div> </code></pre> <p>As the hash portion of the URL changes, <code>App</code> will render a different <code>&lt;Child/&gt;</code> by branching on <code>this.props.route</code>. Pretty straightforward stuff. But it gets complicated fast.</p> <p>Imagine now that <code>Inbox</code> has some nested UI at a path like <code>inbox/messages/:id</code> and <code>inbox/unread</code>, etc. We&#39;ll need to make our url parsing much more intelligent to be able to pass the right information to <code>App</code>, and then to <code>Inbox</code> in order for it to know which URL-mapped child component it should render. We&#39;d then have a branch of components that should be rendered at any given URL. Add a few more of these branches and we&#39;ll end up with a lot of code to keep the URL and our application&#39;s component hierarchy in sync.</p> <h2 id="with-react-router">With React Router</h2> <p>Nested URLs and nested component hierarchy are at the heart of React Router. Lets make our routing for our little app declarative. We use JSX for route configuration because we want to define a view hierarchy with properties, so its a pefect fit.</p> <pre><code class="lang-js"><div class="highlight"><pre><span class="kd">var</span> <span class="nx">Router</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;react-router&#39;</span><span class="p">);</span> <span class="kd">var</span> <span class="nx">Route</span> <span class="o">=</span> <span class="nx">Router</span><span class="p">.</span><span class="nx">Route</span><span class="p">;</span> <span class="c1">// declare our routes and their hierarchy</span> <span class="kd">var</span> <span class="nx">routes</span> <span class="o">=</span> <span class="p">(</span> <span class="o">&lt;</span><span class="nx">Route</span> <span class="nx">handler</span><span class="o">=</span><span class="p">{</span><span class="nx">App</span><span class="p">}</span><span class="o">&gt;</span> <span class="o">&lt;</span><span class="nx">Route</span> <span class="nx">path</span><span class="o">=</span><span class="s2">&quot;about&quot;</span> <span class="nx">handler</span><span class="o">=</span><span class="p">{</span><span class="nx">About</span><span class="p">}</span><span class="o">/&gt;</span> <span class="o">&lt;</span><span class="nx">Route</span> <span class="nx">path</span><span class="o">=</span><span class="s2">&quot;inbox&quot;</span> <span class="nx">handler</span><span class="o">=</span><span class="p">{</span><span class="nx">Inbox</span><span class="p">}</span><span class="o">/&gt;</span> <span class="o">&lt;</span><span class="err">/Route&gt;</span> <span class="p">);</span> </pre></div> </code></pre> <p>Next we need to delete some code from <code>App</code>. We&#39;ll replace <code>&lt;Child/&gt;</code> with <code>&lt;RouteHandler/&gt;</code> that functions as the old <code>switch</code> block from before.</p> <pre><code class="lang-js"><div class="highlight"><pre><span class="kd">var</span> <span class="nx">RouteHandler</span> <span class="o">=</span> <span class="nx">Router</span><span class="p">.</span><span class="nx">RouteHandler</span><span class="p">;</span> <span class="kd">var</span> <span class="nx">App</span> <span class="o">=</span> <span class="nx">React</span><span class="p">.</span><span class="nx">createClass</span><span class="p">({</span> <span class="nx">render</span> <span class="p">()</span> <span class="p">{</span> <span class="k">return</span> <span class="p">(</span> <span class="o">&lt;</span><span class="nx">div</span><span class="o">&gt;</span> <span class="o">&lt;</span><span class="nx">h1</span><span class="o">&gt;</span><span class="nx">App</span><span class="o">&lt;</span><span class="err">/h1&gt;</span> <span class="o">&lt;</span><span class="nx">RouteHandler</span><span class="o">/&gt;</span> <span class="o">&lt;</span><span class="err">/div&gt;</span> <span class="p">)</span> <span class="p">}</span> <span class="p">});</span> </pre></div> </code></pre> <p>Finally we need to listen to the url and render the application.</p> <pre><code class="lang-js"><div class="highlight"><pre><span class="nx">Router</span><span class="p">.</span><span class="nx">run</span><span class="p">(</span><span class="nx">routes</span><span class="p">,</span> <span class="nx">Router</span><span class="p">.</span><span class="nx">HashLocation</span><span class="p">,</span> <span class="p">(</span><span class="nx">Root</span><span class="p">)</span> <span class="o">=&gt;</span> <span class="p">{</span> <span class="nx">React</span><span class="p">.</span><span class="nx">render</span><span class="p">(</span><span class="o">&lt;</span><span class="nx">Root</span><span class="o">/&gt;</span><span class="p">,</span> <span class="nb">document</span><span class="p">.</span><span class="nx">body</span><span class="p">);</span> <span class="p">});</span> </pre></div> </code></pre> <p><code>Root</code> is a component that bakes in the matched component hierarchy making <code>RouteHandler</code> know what to render.</p> <p>Note that <code>&lt;Route/&gt;</code> components are not ever rendered, they are just configuration objects that the router uses to create an internal tree of routes.</p> <h2 id="adding-more-ui">Adding more UI</h2> <p>Alright, now we&#39;re ready to nest the inbox messages inside the inbox UI. First we&#39;ll make a new <code>Message</code> component and then we&#39;ll add the route under <code>inbox</code> so that the UI will nest.</p> <pre><code class="lang-js"><div class="highlight"><pre><span class="kd">var</span> <span class="nx">Message</span> <span class="o">=</span> <span class="nx">React</span><span class="p">.</span><span class="nx">createClass</span><span class="p">({</span> <span class="nx">render</span> <span class="p">()</span> <span class="p">{</span> <span class="k">return</span> <span class="o">&lt;</span><span class="nx">h3</span><span class="o">&gt;</span><span class="nx">Message</span><span class="o">&lt;</span><span class="err">/h3&gt;;</span> <span class="p">}</span> <span class="p">});</span> <span class="kd">var</span> <span class="nx">routes</span> <span class="o">=</span> <span class="p">(</span> <span class="o">&lt;</span><span class="nx">Route</span> <span class="nx">handler</span><span class="o">=</span><span class="p">{</span><span class="nx">App</span><span class="p">}</span><span class="o">&gt;</span> <span class="o">&lt;</span><span class="nx">Route</span> <span class="nx">path</span><span class="o">=</span><span class="s2">&quot;about&quot;</span> <span class="nx">handler</span><span class="o">=</span><span class="p">{</span><span class="nx">About</span><span class="p">}</span><span class="o">/&gt;</span> <span class="o">&lt;</span><span class="nx">Route</span> <span class="nx">path</span><span class="o">=</span><span class="s2">&quot;inbox&quot;</span> <span class="nx">handler</span><span class="o">=</span><span class="p">{</span><span class="nx">Inbox</span><span class="p">}</span><span class="o">&gt;</span> <span class="o">&lt;</span><span class="nx">Route</span> <span class="nx">path</span><span class="o">=</span><span class="s2">&quot;messages/:id&quot;</span> <span class="nx">handler</span><span class="o">=</span><span class="p">{</span><span class="nx">Message</span><span class="p">}</span><span class="o">/&gt;</span> <span class="o">&lt;</span><span class="err">/Route&gt;</span> <span class="o">&lt;</span><span class="err">/Route&gt;</span> <span class="p">);</span> </pre></div> </code></pre> <p>Now visits to urls like <code>inbox/messages/Jkei3c32</code> will match the new route and nest the UI branch of <code>App -&gt; Inbox -&gt; Message</code>.</p> <h2 id="getting-the-url-parameters">Getting the url parameters</h2> <p>We&#39;re going to need to know something about the message in order to fetch it from the server. We call the component you hand to a <code>&lt;Route/&gt;</code> a <code>RouteHandler</code>. <code>RouteHandler</code> instances get some useful properties injected into them when you render, particularly the parameters from the dynamic segment of your path. In our case, <code>:id</code>.</p> <pre><code class="lang-js"><div class="highlight"><pre><span class="kd">var</span> <span class="nx">Message</span> <span class="o">=</span> <span class="nx">React</span><span class="p">.</span><span class="nx">createClass</span><span class="p">({</span> <span class="nx">componentDidMount</span><span class="o">:</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span> <span class="c1">// from the path `/inbox/messages/:id`</span> <span class="kd">var</span> <span class="nx">id</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">props</span><span class="p">.</span><span class="nx">params</span><span class="p">.</span><span class="nx">id</span><span class="p">;</span> <span class="nx">fetchMessage</span><span class="p">(</span><span class="nx">id</span><span class="p">,</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">err</span><span class="p">,</span> <span class="nx">message</span><span class="p">)</span> <span class="p">{</span> <span class="k">this</span><span class="p">.</span><span class="nx">setState</span><span class="p">({</span> <span class="nx">message</span><span class="o">:</span> <span class="nx">message</span> <span class="p">});</span> <span class="p">})</span> <span class="p">},</span> <span class="c1">// ...</span> <span class="p">});</span> </pre></div> </code></pre> <h2 id="nested-ui-and-nested-urls-need-not-be-coupled">Nested UI and Nested URLs need not be coupled</h2> <p>With React Router, you don&#39;t need to nest your UI in order to get a nested URL. Inversely, to get nested UI, you don&#39;t need to have nested URLs either.</p> <p>Lets make a new url at <code>/about/company</code>, but without nesting the UI inside of the <code>About</code> component.</p> <pre><code class="lang-js"><div class="highlight"><pre><span class="kd">var</span> <span class="nx">routes</span> <span class="o">=</span> <span class="p">(</span> <span class="o">&lt;</span><span class="nx">Route</span> <span class="nx">handler</span><span class="o">=</span><span class="p">{</span><span class="nx">App</span><span class="p">}</span><span class="o">&gt;</span> <span class="o">&lt;</span><span class="nx">Route</span> <span class="nx">path</span><span class="o">=</span><span class="s2">&quot;about&quot;</span> <span class="nx">handler</span><span class="o">=</span><span class="p">{</span><span class="nx">About</span><span class="p">}</span><span class="o">/&gt;</span> <span class="o">&lt;</span><span class="nx">Route</span> <span class="nx">path</span><span class="o">=</span><span class="s2">&quot;about/company&quot;</span> <span class="nx">handler</span><span class="o">=</span><span class="p">{</span><span class="nx">Company</span><span class="p">}</span><span class="o">/&gt;</span> <span class="o">&lt;</span><span class="err">/Route&gt;</span> <span class="p">);</span> </pre></div> </code></pre> <p>Though our url is nested, the UI of <code>About</code> and <code>Company</code> are siblings.</p> <p>Now lets go the other way and add the url <code>/archive/messages/:id</code> and have it nested under our inbox UI even though the URL is not nested. We have to do three things for this to work:</p> <ol> <li>Start the path with <code>/</code> to signal that its an absolute path. This won’t “inherit” the parent path the way <code>inbox/messages/:id</code> gets inherited.</li> <li>Nest the <code>&lt;Route/&gt;</code> under the <code>inbox</code> route to cause the UI to nest.</li> <li>Ensure you have all the necessary dynamic segments, we only have <code>:id</code> so its pretty easy.</li> </ol> <pre><code class="lang-js"><div class="highlight"><pre><span class="kd">var</span> <span class="nx">routes</span> <span class="o">=</span> <span class="p">(</span> <span class="o">&lt;</span><span class="nx">Route</span> <span class="nx">handler</span><span class="o">=</span><span class="p">{</span><span class="nx">App</span><span class="p">}</span><span class="o">&gt;</span> <span class="o">&lt;</span><span class="nx">Route</span> <span class="nx">path</span><span class="o">=</span><span class="s2">&quot;inbox&quot;</span> <span class="nx">handler</span><span class="o">=</span><span class="p">{</span><span class="nx">Inbox</span><span class="p">}</span><span class="o">&gt;</span> <span class="o">&lt;</span><span class="nx">Route</span> <span class="nx">path</span><span class="o">=</span><span class="s2">&quot;messages/:id&quot;</span> <span class="nx">handler</span><span class="o">=</span><span class="p">{</span><span class="nx">Message</span><span class="p">}</span><span class="o">/&gt;</span> <span class="o">&lt;</span><span class="nx">Route</span> <span class="nx">path</span><span class="o">=</span><span class="s2">&quot;/archive/messages/:id&quot;</span> <span class="nx">handler</span><span class="o">=</span><span class="p">{</span><span class="nx">Message</span><span class="p">}</span><span class="o">/&gt;</span> <span class="o">&lt;</span><span class="err">/Route&gt;</span> <span class="o">&lt;</span><span class="err">/Route&gt;</span> <span class="p">);</span> </pre></div> </code></pre> <p>That&#39;s the gist of React Router. Application UIs are boxes inside of boxes inside of boxes; now you can keep those boxes in sync with the URL.</p> </div></article></section><section><article class="Doc"><h1 class="Heading" id="DefaultRoute"><a class="HeadingLink" href="#DefaultRoute">DefaultRoute</a><span class="CategoryName">Route Configuration</span></h1><div><p>A <code>DefaultRoute</code> will be the matched child route when the parent&#39;s path matches exactly.</p> <p>You&#39;d want to use this to ensures a child <code>RouteHandler</code> is always rendered when there is no child match. Think of it like <code>index.html</code> in a directory of a static html server.</p> <h2 id="props">Props</h2> <h3 id="-handler-"><code>handler</code></h3> <p>The <code>RouteHandler</code> component you want to be rendered when the route is matched.</p> <h3 id="-name-optional-"><code>name</code> (optional)</h3> <p>The name of the route used when linking or transitioning to the route.</p> <h2 id="example">Example</h2> <pre><code class="lang-xml"><div class="highlight"><pre><span class="nt">&lt;Route</span> <span class="na">path=</span><span class="s">&quot;/&quot;</span> <span class="na">handler=</span><span class="s">{App}</span><span class="nt">&gt;</span> <span class="c">&lt;!--</span> <span class="c"> When the url is `/`, this route will be active. In other</span> <span class="c"> words, `Home` will be the `&lt;RouteHandler/&gt;` in `App`.</span> <span class="c"> --&gt;</span> <span class="nt">&lt;DefaultRoute</span> <span class="na">handler=</span><span class="s">{Home}/</span><span class="nt">&gt;</span> <span class="nt">&lt;Route</span> <span class="na">name=</span><span class="s">&quot;about&quot;</span> <span class="na">handler=</span><span class="s">{About}/</span><span class="nt">&gt;</span> <span class="nt">&lt;Route</span> <span class="na">name=</span><span class="s">&quot;users&quot;</span> <span class="na">handler=</span><span class="s">{Users}</span><span class="nt">&gt;</span> <span class="nt">&lt;Route</span> <span class="na">name=</span><span class="s">&quot;user&quot;</span> <span class="na">handler=</span><span class="s">{User}</span> <span class="na">path=</span><span class="s">&quot;/user/:id&quot;</span><span class="nt">/&gt;</span> <span class="c">&lt;!-- when the url is `/users`, this will be active --&gt;</span> <span class="nt">&lt;DefaultRoute</span> <span class="na">name=</span><span class="s">&quot;users-index&quot;</span> <span class="na">handler=</span><span class="s">{UsersIndex}/</span><span class="nt">&gt;</span> <span class="nt">&lt;/Route&gt;</span> <span class="nt">&lt;/Route&gt;</span> </pre></div> </code></pre> </div></article><article class="Doc"><h1 class="Heading" id="NotFoundRoute"><a class="HeadingLink" href="#NotFoundRoute">NotFoundRoute</a><span class="CategoryName">Route Configuration</span></h1><div><p>A <code>NotFoundRoute</code> is active when the beginning of its parent&#39;s path matches the URL but none of its siblings do. It can be found at any level of your hierarchy, allowing you to have a context-aware &quot;not found&quot; screens.</p> <p>You&#39;d want to use this to handle bad links and users typing invalid urls into the address bar.</p> <p><strong>Note</strong>: This is not intended to be used for when a <em>resource</em> is not found. There is a difference between the router not finding a matched path and a valid URL that results in a resource not being found. The url <code>courses/123</code> is a valid url and results in a matched route, therefore it was &quot;found&quot; as far as routing is concerned. Then, if we fetch some data and discover that the course <code>123</code> does not exist, we do not want to transition to a new route. Just like on the server, you go ahead and serve the url but render different UI (and use a different status code). You shouldn&#39;t ever try to transition to a <code>NotFoundRoute</code>.</p> <h2 id="props">Props</h2> <h3 id="-handler-"><code>handler</code></h3> <p>The <code>RouteHandler</code> component you want to be rendered when the route is matched.</p> <h2 id="example">Example</h2> <pre><code class="lang-xml"><div class="highlight"><pre><span class="nt">&lt;Route</span> <span class="na">path=</span><span class="s">&quot;/&quot;</span> <span class="na">handler=</span><span class="s">{App}</span><span class="nt">&gt;</span> <span class="nt">&lt;Route</span> <span class="na">name=</span><span class="s">&quot;course&quot;</span> <span class="na">path=</span><span class="s">&quot;course/:courseId&quot;</span> <span class="na">handler=</span><span class="s">{Course}</span><span class="nt">&gt;</span> <span class="nt">&lt;Route</span> <span class="na">name=</span><span class="s">&quot;course-dashboard&quot;</span> <span class="na">path=</span><span class="s">&quot;dashboard&quot;</span> <span class="na">handler=</span><span class="s">{Dashboard}/</span><span class="nt">&gt;</span> <span class="c">&lt;!-- ie: `/course/123/foo` --&gt;</span> <span class="nt">&lt;NotFoundRoute</span> <span class="na">handler=</span><span class="s">{CourseRouteNotFound}</span> <span class="nt">/&gt;</span> <span class="nt">&lt;/Route&gt;</span> <span class="c">&lt;!-- ie: `/flkjasdf` --&gt;</span> <span class="nt">&lt;NotFoundRoute</span> <span class="na">handler=</span><span class="s">{NotFound}</span> <span class="nt">/&gt;</span> <span class="nt">&lt;/Route&gt;</span> </pre></div> </code></pre> <p>The last <code>NotFoundRoute</code> will render inside the <code>App</code>, the first will rendering inside of <code>Course</code>.</p> </div></article><article class="Doc"><h1 class="Heading" id="Redirect"><a class="HeadingLink" href="#Redirect">Redirect</a><span class="CategoryName">Route Configuration</span></h1><div><p>A <code>Redirect</code> sets up a redirect to another route in your application to maintain old URLs.</p> <h2 id="props">Props</h2> <h3 id="-from-"><code>from</code></h3> <p>The path you want to redirect from, including dynamic segments. Defaults to <code>*</code> so you can redirect anything not found to somewhere else.</p> <h3 id="-to-"><code>to</code></h3> <p>The <code>name</code> of the route you want to redirect to.</p> <h3 id="-params-"><code>params</code></h3> <p>By default, the parameters will just pass through to the new route, but you can specify them if you need to (usually you shouldn&#39;t).</p> <h3 id="-query-"><code>query</code></h3> <p>By default, the query parameters will just pass through to the new route, but you can specify them if you need to (usually you shouldn&#39;t).</p> <h2 id="example">Example</h2> <pre><code class="lang-xml"><div class="highlight"><pre><span class="c">&lt;!--</span> <span class="c"> lets say we want to change from `/profile/123` to `/about/123`</span> <span class="c"> and redirect `/get-in-touch` to `/contact`</span> <span class="c">--&gt;</span> <span class="nt">&lt;Route</span> <span class="na">handler=</span><span class="s">{App}</span><span class="nt">&gt;</span> <span class="nt">&lt;Route</span> <span class="na">name=</span><span class="s">&quot;contact&quot;</span> <span class="na">handler=</span><span class="s">{Contact}/</span><span class="nt">&gt;</span> <span class="nt">&lt;Route</span> <span class="na">name=</span><span class="s">&quot;about-user&quot;</span> <span class="na">path=</span><span class="s">&quot;about/:userId&quot;</span> <span class="na">handler=</span><span class="s">{UserProfile}/</span><span class="nt">&gt;</span> <span class="nt">&lt;Route</span> <span class="na">name=</span><span class="s">&quot;course&quot;</span> <span class="na">path=</span><span class="s">&quot;course/:courseId&quot;</span><span class="nt">&gt;</span> <span class="nt">&lt;Route</span> <span class="na">name=</span><span class="s">&quot;course-dashboard&quot;</span> <span class="na">path=</span><span class="s">&quot;dashboard&quot;</span> <span class="na">handler=</span><span class="s">{Dashboard}/</span><span class="nt">&gt;</span> <span class="nt">&lt;Route</span> <span class="na">name=</span><span class="s">&quot;course-assignments&quot;</span> <span class="na">path=</span><span class="s">&quot;assignments&quot;</span> <span class="na">handler=</span><span class="s">{Assignments}/</span><span class="nt">&gt;</span> <span class="nt">&lt;/Route&gt;</span> <span class="c">&lt;!-- `/get-in-touch` -&gt; `/contact` --&gt;</span> <span class="nt">&lt;Redirect</span> <span class="na">from=</span><span class="s">&quot;get-in-touch&quot;</span> <span class="na">to=</span><span class="s">&quot;contact&quot;</span> <span class="nt">/&gt;</span> <span class="c">&lt;!-- `/profile/123` -&gt; `/about/123` --&gt;</span> <span class="nt">&lt;Redirect</span> <span class="na">from=</span><span class="s">&quot;profile/:userId&quot;</span> <span class="na">to=</span><span class="s">&quot;about-user&quot;</span> <span class="nt">/&gt;</span> <span class="c">&lt;!-- `/profile/me` -&gt; `/about-user/123` --&gt;</span> <span class="nt">&lt;Redirect</span> <span class="na">from=</span><span class="s">&quot;profile/me&quot;</span> <span class="na">to=</span><span class="s">&quot;about-user&quot;</span> <span class="na">params=</span><span class="s">{{userId:</span> <span class="err">SESSION.USER_ID}}</span> <span class="nt">/&gt;</span> <span class="nt">&lt;/Route&gt;</span> </pre></div> </code></pre> <p>Note that the <code>&lt;Redirect/&gt;</code> can be placed anywhere in the route hierarchy, if you&#39;d prefer the redirects to be next to their respective routes, the <code>from</code> path will match the same as a regular route <code>path</code>.</p> <pre><code class="lang-xml"><div class="highlight"><pre><span class="nt">&lt;Route</span> <span class="na">handler=</span><span class="s">{App}</span><span class="nt">&gt;</span> <span class="nt">&lt;Route</span> <span class="na">name=</span><span class="s">&quot;course&quot;</span> <span class="na">path=</span><span class="s">&quot;course/:courseId&quot;</span><span class="nt">&gt;</span> <span class="nt">&lt;Route</span> <span class="na">name=</span><span class="s">&quot;course-dashboard&quot;</span> <span class="na">path=</span><span class="s">&quot;dashboard&quot;</span> <span class="na">handler=</span><span class="s">{Dashboard}/</span><span class="nt">&gt;</span> <span class="c">&lt;!-- /course/123/home -&gt; /course/123/dashboard --&gt;</span> <span class="nt">&lt;Redirect</span> <span class="na">from=</span><span class="s">&quot;home&quot;</span> <span class="na">to=</span><span class="s">&quot;course-dashboard&quot;</span> <span class="nt">/&gt;</span> <span class="nt">&lt;/Route&gt;</span> <span class="nt">&lt;/Route&gt;</span> </pre></div> </code></pre> </div></article><article class="Doc"><h1 class="Heading" id="Route"><a class="HeadingLink" href="#Route">Route</a><span class="CategoryName">Route Configuration</span></h1><div><p>A <code>Route</code> is used to declaratively map routes to your application&#39;s screen hiearchy.</p> <h2 id="props">Props</h2> <h3 id="-name-optional-"><code>name</code> (optional)</h3> <p>The unique name of the route, used in the <code>Link</code> component and the router&#39;s transition methods.</p> <h3 id="-path-optional-"><code>path</code> (optional)</h3> <p>The path used in the URL. If left undefined, the path will be defined by the <code>name</code>, and if there is no name, will default to <code>/</code>.</p> <p>Please refer to the <a href="#TODO">Path Matching Guide</a> to learn more about supported path matching syntax.</p> <h3 id="-handler-"><code>handler</code></h3> <p>The <code>RouteHandler</code> component to be rendered when the route is active.</p> <h3 id="-children-"><code>children</code></h3> <p>Routes can be nested. When a child route path matches, the parent route is also activated. Please refer to the <a href="#TODO">overview</a> since this is a very critical part of the router&#39;s design.</p> <h3 id="-ignorescrollbehavior-"><code>ignoreScrollBehavior</code></h3> <p>When a route or its <code>params</code> change, the router adjusts window scroll position according to the [<code>scrollBehavior</code>][scrollbehavior]. This is generally desirable but you might want to opt-out of scrolling adjustment for a specific route or a group of routes.</p> <p>If you specify <code>ignoreScrollBehavior</code>, changes in <code>params</code> or any transitions within its <code>children</code> will not adjust scroll position. This can be useful on a search page or in a tabbed interface.</p> <p>Note that changes in <code>query</code> never adjust scroll position, regardless of the value of this attribute.</p> <h2 id="example">Example</h2> <pre><code class="lang-xml"><div class="highlight"><pre><span class="c">&lt;!-- `path` defaults to &#39;/&#39; since no name or path provided --&gt;</span> <span class="nt">&lt;Route</span> <span class="na">handler=</span><span class="s">{App}</span><span class="nt">&gt;</span> <span class="c">&lt;!-- path is automatically assigned to the name since it is omitted --&gt;</span> <span class="nt">&lt;Route</span> <span class="na">name=</span><span class="s">&quot;about&quot;</span> <span class="na">handler=</span><span class="s">{About}/</span><span class="nt">&gt;</span> <span class="nt">&lt;Route</span> <span class="na">name=</span><span class="s">&quot;users&quot;</span> <span class="na">handler=</span><span class="s">{Users}</span><span class="nt">&gt;</span> <span class="c">&lt;!--</span> <span class="c"> note the dynamic segment in the path, and that it starts with `/`,</span> <span class="c"> which makes it &quot;absolute&quot;, or rather, it doesn&#39;t inherit the path</span> <span class="c"> from the parent route</span> <span class="c"> --&gt;</span> <span class="nt">&lt;Route</span> <span class="na">name=</span><span class="s">&quot;user&quot;</span> <span class="na">handler=</span><span class="s">{User}</span> <span class="na">path=</span><span class="s">&quot;/user/:id&quot;</span><span class="nt">/&gt;</span> <span class="nt">&lt;/Route&gt;</span> <span class="nt">&lt;/Route&gt;</span> </pre></div> </code></pre> </div></article></section><section><article class="Doc"><h1 class="Heading" id="Router.create"><a class="HeadingLink" href="#Router.create">Router.create</a><span class="CategoryName">Top-Level</span></h1><div><p>Creates a new router. Useful to pass around your app to be able to call <code>transitionTo</code> and friends w/o being inside of a component.</p> <h2 id="signature">Signature</h2> <p><code>Router.create(options)</code></p> <h2 id="options">Options</h2> <h3 id="-routes-"><code>routes</code></h3> <h3 id="-location-"><code>location</code></h3> <h3 id="-scrollbehavior-"><code>scrollBehavior</code></h3> <h3 id="-onabort-"><code>onAbort</code></h3> <p>Used server-side to know when a route was redirected.</p> <h2 id="methods">Methods</h2> <h3 id="-run-callback-"><code>run(callback)</code></h3> <p>Runs the router, the same as <code>Router.run</code>.</p> <h2 id="example">Example</h2> <pre><code class="lang-js"><div class="highlight"><pre><span class="c1">// the more common API is</span> <span class="nx">Router</span><span class="p">.</span><span class="nx">run</span><span class="p">(</span><span class="nx">routes</span><span class="p">,</span> <span class="nx">Router</span><span class="p">.</span><span class="nx">HistoryLocation</span><span class="p">,</span> <span class="nx">callback</span><span class="p">);</span> <span class="c1">// which is just a shortcut for</span> <span class="kd">var</span> <span class="nx">router</span> <span class="o">=</span> <span class="nx">Router</span><span class="p">.</span><span class="nx">create</span><span class="p">({</span> <span class="nx">routes</span><span class="o">:</span> <span class="nx">routes</span><span class="p">,</span> <span class="nx">location</span><span class="o">:</span> <span class="nx">Router</span><span class="p">.</span><span class="nx">HistoryLocation</span> <span class="p">});</span> <span class="nx">router</span><span class="p">.</span><span class="nx">run</span><span class="p">(</span><span class="nx">callback</span><span class="p">);</span> </pre></div> </code></pre> </div></article><article class="Doc"><h1 class="Heading" id="Router.run"><a class="HeadingLink" href="#Router.run">Router.run</a><span class="CategoryName">Top-Level</span></h1><div><p>The main API into react router. It runs your routes, matching them against a location, and then calls back with the next state for you to render.</p> <h2 id="signature">Signature</h2> <p><code>Router.run(routes, [location,] callback)</code></p> <h2 id="arguments">Arguments</h2> <h3 id="-routes-"><code>routes</code></h3> <p>Your route config. See <a href="#TODO">Route</a></p> <h3 id="-location-optional"><code>location</code> optional</h3> <p>Defaults to <code>Router.HashLocation</code>. If given a <code>Location</code> object, it will setup and listen for changes on it, if given a string path, the router will immediately match that path and callback.</p> <h4 id="examples">Examples</h4> <pre><code class="lang-js"><div class="highlight"><pre><span class="c1">// Defaults to `Router.HashLocation`</span> <span class="c1">// callback is called whenever the hash changes</span> <span class="nx">Router</span><span class="p">.</span><span class="nx">run</span><span class="p">(</span><span class="nx">routes</span><span class="p">,</span> <span class="nx">callback</span><span class="p">);</span> <span class="c1">// HTML5 History</span> <span class="c1">// callback is called when history events happen</span> <span class="nx">Router</span><span class="p">.</span><span class="nx">run</span><span class="p">(</span><span class="nx">routes</span><span class="p">,</span> <span class="nx">Router</span><span class="p">.</span><span class="nx">HistoryLocation</span><span class="p">,</span> <span class="nx">callback</span><span class="p">);</span> <span class="c1">// Server rendering</span> <span class="c1">// callback is called once, immediately.</span> <span class="nx">Router</span><span class="p">.</span><span class="nx">run</span><span class="p">(</span><span class="nx">routes</span><span class="p">,</span> <span class="s1">&#39;/some/path&#39;</span><span class="p">,</span> <span class="nx">callback</span><span class="p">);</span> </pre></div> </code></pre> <h3 id="-callback-root-state-"><code>callback(Root, state)</code></h3> <p>The callback receives two arguments:</p> <ol> <li><code>Root</code></li> <li><code>state</code></li> </ol> <h4 id="-root-"><code>Root</code></h4> <p>A ReactComponent class with the current match all wrapped up inside it, ready for you to render.</p> <h4 id="-state-"><code>state</code></h4> <p>An object containing the matched state.</p> <h4 id="-state-path-"><code>state.path</code></h4> <p>The current URL path with query string.</p> <h4 id="-state-action-"><code>state.action</code></h4> <p>The action that lead to the route change.</p> <h4 id="-state-pathname-"><code>state.pathname</code></h4> <p>The current URL path without the query string.</p> <h4 id="-state-params-"><code>state.params</code></h4> <p>The active params in the location match.</p> <h4 id="-state-query-"><code>state.query</code></h4> <p>The active query in the location match.</p> <h4 id="-state-routes-"><code>state.routes</code></h4> <p>An array of the matched <a href="#TODO">routes</a>. Very useful for fetching data before rendering.</p> <p>See also: <a href="#TODO">Route</a>.</p> <h2 id="examples">Examples</h2> <p>Basic Usage:</p> <pre><code class="lang-js"><div class="highlight"><pre><span class="nx">Router</span><span class="p">.</span><span class="nx">run</span><span class="p">(</span><span class="nx">routes</span><span class="p">,</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">Root</span><span class="p">)</span> <span class="p">{</span> <span class="c1">// whenever the url changes, this callback is called again</span> <span class="nx">React</span><span class="p">.</span><span class="nx">render</span><span class="p">(</span><span class="o">&lt;</span><span class="nx">Root</span><span class="o">/&gt;</span><span class="p">,</span> <span class="nb">document</span><span class="p">.</span><span class="nx">body</span><span class="p">);</span> <span class="p">});</span> </pre></div> </code></pre> <p>Sample data fetching using <code>state.routes</code>. Check out the <a href="#TODO">async-data</a> example.</p> <pre><code class="lang-js"><div class="highlight"><pre><span class="kd">var</span> <span class="nx">resolveHash</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;when/keys&#39;</span><span class="p">).</span><span class="nx">all</span><span class="p">;</span> <span class="kd">var</span> <span class="nx">SampleHandler</span> <span class="o">=</span> <span class="nx">React</span><span class="p">.</span><span class="nx">createClass</span><span class="p">({</span> <span class="nx">statics</span><span class="o">:</span> <span class="p">{</span> <span class="c1">// this is going to be called in the `run` callback</span> <span class="nx">fetchData</span><span class="o">:</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">params</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="nx">fetchStuff</span><span class="p">(</span><span class="nx">params</span><span class="p">);</span> <span class="p">}</span> <span class="p">},</span> <span class="c1">// ...</span> <span class="p">});</span> <span class="nx">Router</span><span class="p">.</span><span class="nx">run</span><span class="p">(</span><span class="nx">routes</span><span class="p">,</span> <span class="nx">Router</span><span class="p">.</span><span class="nx">HistoryLocation</span><span class="p">,</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">Root</span><span class="p">,</span> <span class="nx">state</span><span class="p">)</span> <span class="p">{</span> <span class="c1">// create the promises hash</span> <span class="kd">var</span> <span class="nx">promises</span> <span class="o">=</span> <span class="nx">state</span><span class="p">.</span><span class="nx">routes</span><span class="p">.</span><span class="nx">filter</span><span class="p">(</span><span class="kd">function</span> <span class="p">(</span><span class="nx">route</span><span class="p">)</span> <span class="p">{</span> <span class="c1">// gather up the handlers that have a static `fetchData` method</span> <span class="k">return</span> <span class="nx">route</span><span class="p">.</span><span class="nx">handler</span><span class="p">.</span><span class="nx">fetchData</span><span class="p">;</span> <span class="p">}).</span><span class="nx">reduce</span><span class="p">(</span><span class="kd">function</span> <span class="p">(</span><span class="nx">promises</span><span class="p">,</span> <span class="nx">route</span><span class="p">)</span> <span class="p">{</span> <span class="c1">// reduce to a hash of `key:promise`</span> <span class="nx">promises</span><span class="p">[</span><span class="nx">route</span><span class="p">.</span><span class="nx">name</span><span class="p">]</span> <span class="o">=</span> <span class="nx">route</span><span class="p">.</span><span class="nx">handler</span><span class="p">.</span><span class="nx">fetchData</span><span class="p">(</span><span class="nx">state</span><span class="p">.</span><span class="nx">params</span><span class="p">);</span> <span class="k">return</span> <span class="nx">promises</span><span class="p">;</span> <span class="p">},</span> <span class="p">{});</span> <span class="nx">resolveHash</span><span class="p">(</span><span class="nx">promises</span><span class="p">).</span><span class="nx">then</span><span class="p">(</span><span class="kd">function</span> <span class="p">(</span><span class="nx">data</span><span class="p">)</span> <span class="p">{</span> <span class="c1">// wait until we have data to render, the old screen stays up until</span> <span class="c1">// we render</span> <span class="nx">React</span><span class="p">.</span><span class="nx">render</span><span class="p">(</span><span class="o">&lt;</span><span class="nx">Root</span> <span class="nx">data</span><span class="o">=</span><span class="p">{</span><span class="nx">data</span><span class="p">}</span><span class="o">/&gt;</span><span class="p">,</span> <span class="nb">document</span><span class="p">.</span><span class="nx">body</span><span class="p">);</span> <span class="p">});</span> <span class="p">});</span> </pre></div> </code></pre> <p>Server Rendering</p> <pre><code class="lang-js"><div class="highlight"><pre><span class="nx">something</span><span class="p">.</span><span class="nx">serve</span><span class="p">(</span><span class="kd">function</span> <span class="p">(</span><span class="nx">req</span><span class="p">,</span> <span class="nx">res</span><span class="p">)</span> <span class="p">{</span> <span class="nx">Router</span><span class="p">.</span><span class="nx">run</span><span class="p">(</span><span class="nx">routes</span><span class="p">,</span> <span class="nx">req</span><span class="p">.</span><span class="nx">path</span><span class="p">,</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">Root</span><span class="p">,</span> <span class="nx">state</span><span class="p">)</span> <span class="p">{</span> <span class="c1">// could fetch data like in the previous example</span> <span class="nx">fetchData</span><span class="p">(</span><span class="nx">state</span><span class="p">.</span><span class="nx">matches</span><span class="p">).</span><span class="nx">then</span><span class="p">(</span><span class="kd">function</span> <span class="p">(</span><span class="nx">data</span><span class="p">)</span> <span class="p">{</span> <span class="kd">var</span> <span class="nx">html</span> <span class="o">=</span> <span class="nx">React</span><span class="p">.</span><span class="nx">renderToString</span><span class="p">(</span><span class="o">&lt;</span><span class="nx">Root</span> <span class="nx">data</span><span class="o">=</span><span class="p">{</span><span class="nx">data</span><span class="p">}</span> <span class="o">/&gt;</span><span class="p">);</span> <span class="nx">res</span><span class="p">.</span><span class="nx">send</span><span class="p">(</span><span class="nx">html</span><span class="p">);</span> <span class="p">});</span> <span class="p">});</span> <span class="p">});</span> </pre></div> </code></pre> </div></article></section><section><article class="Doc"><h1 class="Heading" id="Link"><a class="HeadingLink" href="#Link">Link</a><span class="CategoryName">Components</span></h1><div><p>The primary way to allow users to navigate around your application. <code>Link</code> will render a fully accesible anchor tag with the proper href.</p> <p>A <code>Link</code> also knows when the route it links to is active and automatically applies its <code>activeClassName</code> and/or <code>activeStyle</code> when it is.</p> <h2 id="props">Props</h2> <h3 id="-to-"><code>to</code></h3> <p>The name of the route to link to, or a full URL.</p> <h3 id="-params-"><code>params</code></h3> <p>An object of the names/values that correspond with dynamic segments in your route path.</p> <h3 id="-query-"><code>query</code></h3> <p>An object of the names/values that will become the query parameters in the path.</p> <h4 id="example">Example</h4> <pre><code class="lang-js"><div class="highlight"><pre><span class="c1">// given a route config like this</span> <span class="o">&lt;</span><span class="nx">Route</span> <span class="nx">name</span><span class="o">=</span><span class="s2">&quot;user&quot;</span> <span class="nx">path</span><span class="o">=</span><span class="s2">&quot;/users/:userId&quot;</span><span class="o">/&gt;</span> <span class="c1">// create a link with this</span> <span class="o">&lt;</span><span class="nx">Link</span> <span class="nx">to</span><span class="o">=</span><span class="s2">&quot;user&quot;</span> <span class="nx">params</span><span class="o">=</span><span class="p">{{</span><span class="nx">userId</span><span class="o">:</span> <span class="s2">&quot;123&quot;</span><span class="p">}}</span><span class="o">/&gt;</span> <span class="c1">// though, if your user properties match up to the dynamic segements:</span> <span class="o">&lt;</span><span class="nx">Link</span> <span class="nx">to</span><span class="o">=</span><span class="s2">&quot;user&quot;</span> <span class="nx">params</span><span class="o">=</span><span class="p">{</span><span class="nx">user</span><span class="p">}</span><span class="o">/&gt;</span> </pre></div> </code></pre> <h3 id="-query-"><code>query</code></h3> <p>The query string parameters as a JavaScript object.</p> <h3 id="-activeclassname-"><code>activeClassName</code></h3> <p>The className a <code>Link</code> receives when its route is active. Defaults to <code>active</code>.</p> <h3 id="-activestyle-"><code>activeStyle</code></h3> <p>The styles to apply to the link element when its route is active.</p> <h3 id="-onclick-"><code>onClick</code></h3> <p>A custom handler for the click event. Works just like a handler on an <code>&lt;a&gt;</code> tag - calling <code>e.preventDefault()</code> or returning <code>false</code> will prevent the transition from firing, while <code>e.stopPropagation()</code> will prevent the event from bubbling.</p> <h3 id="-others-"><em>others</em></h3> <p>You can also pass props you&#39;d like to be on the <code>&lt;a&gt;</code> such as a title, id, className, etc.</p> <h2 id="example">Example</h2> <p>Given a route like <code>&lt;Route name=&quot;user&quot; path=&quot;/users/:userId&quot;/&gt;</code>:</p> <pre><code class="lang-xml"><div class="highlight"><pre><span class="nt">&lt;Link</span> <span class="na">to=</span><span class="s">&quot;user&quot;</span> <span class="na">params=</span><span class="s">{{userId:</span> <span class="err">use