Actualmente estoy luchando con las rutas de anidación con react router v4.
El ejemplo más cercano fue la configuración de ruta en la documentación de React-Router v4 .
Quiero dividir mi aplicación en 2 partes diferentes.
Una interfaz y un área de administración.
Estaba pensando en algo como esto:
<Match pattern="/" component={Frontpage}>
<Match pattern="/home" component={HomePage} />
<Match pattern="/about" component={AboutPage} />
</Match>
<Match pattern="/admin" component={Backend}>
<Match pattern="/home" component={Dashboard} />
<Match pattern="/users" component={UserPage} />
</Match>
<Miss component={NotFoundPage} />
La interfaz tiene un diseño y un estilo diferentes que el área de administración. Entonces, dentro de la portada, la ruta a casa, aproximadamente, y así deberían ser las rutas secundarias.
/ home debería representarse en el componente Frontpage y / admin / home debería representarse en el componente Backend.
Intenté algunas variaciones, pero siempre terminaba sin golpear / home o / admin / home.
Editar - 19.04.2017
Debido a que esta publicación tiene muchas vistas en este momento, la actualicé con la solución final. Espero que esto ayude a alguien.
Editar - 08.05.2017
Se eliminaron las soluciones antiguas.
Solución final:
Esta es la solución final que estoy usando en este momento. Este ejemplo también tiene un componente de error global como una página 404 tradicional.
import React, { Component } from 'react';
import { Switch, Route, Redirect, Link } from 'react-router-dom';
const Home = () => <div><h1>Home</h1></div>;
const User = () => <div><h1>User</h1></div>;
const Error = () => <div><h1>Error</h1></div>
const Frontend = props => {
console.log('Frontend');
return (
<div>
<h2>Frontend</h2>
<p><Link to="/">Root</Link></p>
<p><Link to="/user">User</Link></p>
<p><Link to="/admin">Backend</Link></p>
<p><Link to="/the-route-is-swiggity-swoute">Swiggity swooty</Link></p>
<Switch>
<Route exact path='/' component={Home}/>
<Route path='/user' component={User}/>
<Redirect to={{
state: { error: true }
}} />
</Switch>
<footer>Bottom</footer>
</div>
);
}
const Backend = props => {
console.log('Backend');
return (
<div>
<h2>Backend</h2>
<p><Link to="/admin">Root</Link></p>
<p><Link to="/admin/user">User</Link></p>
<p><Link to="/">Frontend</Link></p>
<p><Link to="/admin/the-route-is-swiggity-swoute">Swiggity swooty</Link></p>
<Switch>
<Route exact path='/admin' component={Home}/>
<Route path='/admin/user' component={User}/>
<Redirect to={{
state: { error: true }
}} />
</Switch>
<footer>Bottom</footer>
</div>
);
}
class GlobalErrorSwitch extends Component {
previousLocation = this.props.location
componentWillUpdate(nextProps) {
const { location } = this.props;
if (nextProps.history.action !== 'POP'
&& (!location.state || !location.state.error)) {
this.previousLocation = this.props.location
};
}
render() {
const { location } = this.props;
const isError = !!(
location.state &&
location.state.error &&
this.previousLocation !== location // not initial render
)
return (
<div>
{
isError
? <Route component={Error} />
: <Switch location={isError ? this.previousLocation : location}>
<Route path="/admin" component={Backend} />
<Route path="/" component={Frontend} />
</Switch>}
</div>
)
}
}
class App extends Component {
render() {
return <Route component={GlobalErrorSwitch} />
}
}
export default App;
previousLocation
lógica.Respuestas:
En react-router-v4 no anidas
<Routes />
. En cambio, los pones dentro de otro<Component />
.Por ejemplo
debe convertirse
con
Aquí hay un ejemplo básico directamente de la documentación de react-router .
fuente
to="exampleTopicId"
con${match.url}
ser implícito.react-router v6
Una actualización para 2020: la próxima versión v6 tendrá
Route
componentes anidados que Just Work ™. Vea el código de ejemplo en esta publicación de blog .Si bien la pregunta original es sobre v4 / v5 , la respuesta correcta cuando se envíe v6 será usarla si puede . Actualmente está en alfa.
react-router v4 & v5
Es cierto que para anidar rutas, debe colocarlas en el componente secundario de la ruta.
Sin embargo, si prefiere una sintaxis más en línea en lugar de dividir sus Rutas entre los componentes, puede proporcionar un componente funcional al
render
soporte de la Ruta en la que desea anidar.Si está interesado en por qué se
render
debe usar el accesorio, y no elcomponent
accesorio, es porque impide que el componente funcional en línea se vuelva a montar en cada render. Vea la documentación para más detalles.Tenga en cuenta que el ejemplo envuelve las Rutas anidadas en un Fragmento . Antes de React 16, puedes usar un contenedor en su
<div>
lugar.fuente
match.path
, nomatch.url
. El primero se usa generalmente en elpath
accesorio de ruta ; este último cuando se presiona una nueva ruta (por ejemplo Enlaceto
prop)Solo quería mencionar que react-router v4 cambió radicalmente desde que esta pregunta fue publicada / respondida.
¡Ya no hay ningún
<Match>
componente!<Switch>
es asegurarse de que solo se muestre la primera coincidencia.<Redirect>
bueno .. redirige a otra ruta. Use o omitaexact
para incluir o excluir una coincidencia parcial.Ver los documentos. Son geniales. https://reacttraining.com/react-router/
Aquí hay un ejemplo que espero sea útil para responder a su pregunta.
Espero que haya ayudado, házmelo saber. Si este ejemplo no responde a su pregunta lo suficientemente bien, dígame y veré si puedo modificarlo.
fuente
exact
enRedirect
reacttraining.com/react-router/web/api/Redirect Eso sería mucho más limpio de lo<Route exact path="/" render={() => <Redirect to="/path" />} />
que estoy haciendo en su lugar. Al menos no me deja con TypeScript.Algo como esto.
fuente
Logré definir rutas anidadas envolviendo
Switch
y definiendo una ruta anidada antes que la ruta raíz.Referencia: https://github.com/ReactTraining/react-router/blob/master/packages/react-router/docs/api/Switch.md
fuente
Puedes probar algo como Routes.js
App.js
Creo que puedes lograr lo mismo desde aquí también.
fuente
fuente