Nov. 4, 2016
Como usar react-router para crear rutas en react
En este tutorial aprenderemos a usar react-router para crear rutas en nuestra app de react.
Instalando dependencias
Ejecutamos:
npm init -y
npm install --save history react react-dom react-router
npm install --save-dev babel-core babel-loader babel-preset-es2015 babel-preset-react webpack webpack-dev-server
configuramos el webpack.config.js:
var path = require("path")
module.exports = {
  entry: {
    main: path.join(__dirname, "app/js")
  },
  output: {
    filename: "[name].js",
    path: path.join(__dirname, "dist")
  },
  module: {
    loaders: [
      {
        test: /\.js?$/,
        exclude: /node_modules/,
        loader: 'babel-loader',
        query: {
          presets: ["es2015", "react"]
        }
      }
    ]
  },
  resolve: {
    root: path.join(__dirname, "app/js"),
    extensions: ["", ".js"],
    moduleDirectories: ["node_modules"]
  },
  debug: true,
  devtool: "source-map",
  devServer: {
    contentbase: path.join(__dirname, "dist")
  }
}
y creamos una carpeta llamada app y adentro de esta una llamada js, aquí estarán los componentes que usaremos, con react router cada componente cuenta como ruta y es tomado como una pagina completa.
Creando los componentes
Index.js
import React from 'react'
import { render } from 'react-dom'
import { Router, Route, IndexRoute, browserHistory, Link } from 'react-router'
import Home from 'home'
import About from 'about'
import Posts from 'posts'
import Post from 'post'
class App extends React.Component {
  render() {
    return(
      <div>
        <ul>
          <li><Link to="/" >Home </Link></li>
          <li><Link to="/about" >About</Link></li>
          <li><Link to="/posts" >Posts</Link></li>
        </ul>
        { this.props.children }
      </div>
    )
  }
}
render((
  <Router history={browserHistory} >
    <Route path="/" component={App} >
      <IndexRoute component={Home} />
      <Route path="about" component={About}/>
      <Route path="posts" component={Posts}>
        <Route path=":id" component={Post}/>
      </Route>
    </Route>
  </Router>
), document.querySelector("#main"))
Importamos las librerías necesarias y los componentes de las paginas (aun no creados), el componente principal se llama app, este componente es el que se compartirá entre todas las paginas y es por eso que aquí podemos los links, react-router trae en componente llamado Link este recibe la ruta a la cual accederá, es importante poner { this.props.children } para que los componentes hijos (los de las diferentes rutas) puedan aparecer, si queremos hacer render del componente necesitamos el componente Router de react-router:
render((
  <Router history={browserHistory} > //Router indica que esta app funcionara con react-router
    <Route path="/" component={App} > // indicamos la ruta principal "/"
                                      //y el componente que se compartirá entre todas las paginas
      <IndexRoute component={Home} /> //indicamos que componente se mostrara al entrar en "/"
      <Route path="about" component={About}/> //creamos paginas indicando el path                                                                         //y el componente que se  mostrara
      <Route path="posts" component={Posts}>
        <Route path=":id" component={Post}/> //podemos anidar componentes que se relacionen entre si
                                            //esta ruta quedaría de la forma "posts/:id"
      </Route>
    </Route>
  </Router>
), document.querySelector("#main"))
About.js
import React from 'react'
const About = () => (
  <div>
    <p>Pagina Sobre Nosotros.</p>
  </div>
)
export default About;
Home.js
import React from 'react'
const Home = () => (
  <div>
    <p>Bienvenido a la pagina principal.</p>
  </div>
)
export default Home;
Estos dos componentes son sencillos, solo para mostrar información.
Post.js
import React from 'react'
export default class Post extends React.Component {
  constructor(props) {
    super(props)
    this.state = {
      param: ""
    }
  }
  componentDidMount() {
    var id = this.props.params.id
    this.setState({param: id})
  }
  render() {
    return (
      <div>
        <p>Parametro: { this.state.param } </p>
      </div>
    )
  }
}
Este componente espera recibir un parámetro llamado id y posteriormente se encarga de mostrarlo.
Posts.js
import React from 'react'
export default class Posts extends React.Component {
  render() {
    return (
      <div>
        <p>Lista de los posts</p>
      </div>
    )
  }
}
Este componente contiene la lista posts creados.
Ejecutando el proyecto
Necesitamos crear una carpeta llamada dist, donde crearemos un html, index.html:
<!DOCTYPE html>
<html>
<head>
  <title></title>
</head>
<body>
  <div id="main"></div>
  <script src="./main.js"></script>
</body>
</html>
Este html importa el script compilado con todo el código y necesita un div para indicar donde los componentes se mostraran.