react-router-dom switch & match
Renders the first child <Route>
or <Redirect>
that matches the location.
If the URL is /about
, then <About>
, <User>
, and <NoMatch>
will all render because they all match the path. This is by design, allowing us to compose <Route>
s into our apps in many ways, like sidebars and breadcrumbs, bootstrap tabs, etc.
import { Route } from "react-router"; let routes = ( <div> <Route path="/about"> <About /> </Route> <Route path="/:user"> <User /> </Route> <Route> <NoMatch /> </Route> </div> );
Occasionally, however, we want to pick only one <Route>
to render. If we’re at /about
we don’t want to also match /:user
(or show our “404” page). Here’s how to do it with Switch
:
import { Route, Switch } from "react-router"; let routes = ( <Switch> <Route exact path="/"> <Home /> </Route> <Route path="/about"> <About /> </Route> <Route path="/:user"> <User /> </Route> <Route> <NoMatch /> </Route> </Switch> );
Now, if we’re at /about
, <Switch>
will start looking for a matching <Route>
. <Route path="/about"/>
will match and <Switch>
will stop looking for matches and render <About>
. Similarly, if we’re at /michael
then <User>
will render.
We can manually set the variable parameters like this:
<Route path="/scan/detail/:trx/:tokenAddress" component={ScanDetail} />
And then we can get this parameter in the subcomponent:
let { tokenAddress } = this.props.match.params;
A match
object contains information about how a <Route path>
matched the URL. match
objects contain the following properties:
params
- (object) Key/value pairs parsed from the URL corresponding to the dynamic segments of the pathisExact
- (boolean)true
if the entire URL was matched (no trailing characters)path
- (string) The path pattern used to match. Useful for building nested<Route>
surl
- (string) The matched portion of the URL. Useful for building nested<Link>
s
You’ll have access to match
objects in various places:
- Route component as
this.props.match
- Route render as
({ match }) => ()
- Route children as
({ match }) => ()
- withRouter as
this.props.match
- matchPath as the return value
- useRouteMatch as the return value
If a Route does not have a path
, and therefore always matches, you’ll get the closest parent match. Same goes for withRouter
.