Routing D'oh!
React-router is a great addition to React, but yesterday marked the first time I had used it for a project. It led to a period of head scratching, but maybe this post will help someone else avoid the same mistake I made!
Simple Setup
Installing it was simple enough.
npm install --save react-router
Having installed it I then added the import lines,
import {Router, Route, Link, browserHistory} from 'react-router';
and then added some routes to the root component.
render(( ), document.getElementById('test'))
Adding a few links to the components with Link to enable me to test navigation and all should have been good.
About PageThis was intended to give me the following urls,
/ /about /blah
After making the changes a quick refresh of the page (webpack-dev-server really does make life easy) and sure enough I got the page with links. Clicking on the links gave me a surprise though – the URL changed but the page didn’t.
Children?
After some head scratching and a bit of reading around, I discovered that the routing I had added wasn’t quite what I thought in terms of the components. In my minds eye I envisaged this as rendering each component directly, but what I had added actually added was rendering a parent/child relationship.
URL | Parent | Child(ren) |
---|---|---|
\ | home | none |
\about | home | about |
\blah | home | blah |
Nesting
This applies for every level of nesting, so rewriting the routing block to
render(( ), document.getElementById('test'))
Works as expected when displaying /about/about due to using the home component with this.props.children. Using the about component failed as it lacked the this.props.children usage. The relationships look like
URL | Parent | Child | Child |
---|---|---|---|
\ | home | none | none |
\about | home | home | none |
\about\about | home | home | about |
\blah | home | blah | none |
In order to get the behaviour I actually wanted I needed to change the routing block to this.
render(( ), document.getElementById('test'))