Switch.js
class Switch extends React.Component {
render() {
return (
<RouterContext.Consumer>
{context => {
invariant(
context,
'You should not use <Switch> outside a <Router>'
);
const location = this.props.location || context.location;
let element, match;
// We use React.Children.forEach instead of React.Children.toArray().find()
// here because toArray adds keys to all child elements and we do not want
// to trigger an unmount/remount for two <Route>s that render the same
// component at different URLs.
React.Children.forEach(this.props.children, child => {
if (match == null && React.isValidElement(child)) {
element = child;
const path = child.props.path || child.props.from;
match = path
? matchPath(location.pathname, {
...child.props,
path
})
: context.match;
}
});
return match
? React.cloneElement(element, {
location,
computedMatch: match
})
: null;
}}
</RouterContext.Consumer>
);
}
}