Route Configuration Back
A route configuration is basically a set of instructions (指令) to tell a router how to match the URL, and what code to run when it does.
For example, here we will render different components with React Router to match different URLs.
URL | Components |
---|---|
/ |
App |
/about |
App -> About |
/inbox |
App -> Inbox |
/inbox/messages/:id |
App -> Inbox -> Message |
import React from 'react';
import ReactDOM from 'react-dom';
import { Router, Route, Link } from 'react-router';
class App extends React.Component {
render() {
return (
<div>
<h1>App</h1>
<ul>
<li><Link to="/about">About</Link></li>
<li><Link to="/inbox">Inbox</Link></li>
</ul>
{this.props.children}
</div>
);
}
}
class About extends React.Component {
render() {
return (
<div>
<h3>About</h3>
</div>
);
}
}
class Inbox extends React.Component {
render() {
return (
<div>
<h3>Inbox</h3>
{this.props.children || 'Welecome to your Inbox'}
</div>
);
}
}
class Message extends React.Component {
render() {
return (
<div>
<h4>Message: {this.props.params.id}</h4>
</div>
);
}
}
ReactDOM.render(
<Router>
<Route path="/" component={App}>
<Route path="about" component={About}></Route>
<Route path="inbox" component={Inbox}>
<Route path="message/:id" component={Message}></Route>
</Route>
</Route>
</Router>,
document.getElementById('content')
);
Adding an Index
Imagine we'd like to render another component inside of App
when the URL is /
. Currently, this.props.children
inside of App's render method is undefined
in this case. We can use an <IndexRoute>
to specify a "default" page.
URL | Components |
---|---|
/ |
App -> Dashboard |
/about |
App -> About |
/inbox |
App -> Inbox |
/inbox/messages/:id |
App -> Inbox -> Message |
import React from 'react';
import ReactDOM from 'react-dom';
import { Router, IndexRoute, Route, Link } from 'react-router';
class Dashboard extends React.Component {
render() {
return (
<div>
Welcome to the App!
</div>
);
}
}
ReactDOM.render(
<Router>
<Route path="/" component={App}>
<IndexRoute component={Dashboard}></IndexRoute>
<Route path="about" component={About}></Route>
<Route path="inbox" component={Inbox}>
<Route path="message/:id" component={Message}></Route>
</Route>
</Route>
</Router>,
document.getElementById('content')
);
Decoupling (解耦) the UI from the URL
It would be nice if we could remove the /inbox
segment from the /inbox/messages/:id
URL pattern, but still render Message
nested inside the App -> Inbox UI
. Pathless routes let us do exactly that.
URL | Components |
---|---|
/ |
App -> Dashboard |
/about |
App -> About |
/inbox |
App -> Inbox |
/messages/:id |
App -> Inbox -> Message |
import React from 'react';
import ReactDOM from 'react-dom';
import { Router, IndexRoute, Route, Link } from 'react-router';
ReactDOM.render(
<Router>
<Route path="/" component={App}>
<IndexRoute component={Dashboard}></IndexRoute>
<Route path="about" component={About}></Route>
<Route path="inbox" component={Inbox}></Route>
<Route component={Inbox}>
<Route path="message/:id" component={Message}></Route>
</Route>
</Route>
</Router>,
document.getElementById('content')
);
Preserving a old version
If we want to preserve the old version /inbox/message/:id
, we can just use <Redirect>
import React from 'react';
import ReactDOM from 'react-dom';
import { Router, IndexRoute, Route, Redirect, Link } from 'react-router';
ReactDOM.render(
<Router>
<Route path="/" component={App}>
<IndexRoute component={Dashboard}></IndexRoute>
<Route path="about" component={About}></Route>
<Route path="inbox" component={Inbox}>
<Redirect from="message/:id" to="/message/:id"></Redirect>
</Route>
<Route component={Inbox}>
<Route path="message/:id" component={Message}></Route>
</Route>
</Route>
</Router>,
document.getElementById('content')
);