Atualmente, estou lutando com rotas de aninhamento usando o roteador de reação v4.
O exemplo mais próximo foi a configuração de rota na documentação do React-Router v4 .
Quero dividir meu aplicativo em duas partes diferentes.
Uma interface e uma área administrativa.
Eu estava pensando em algo assim:
<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} />
O front-end possui um layout e estilo diferentes da área administrativa. Assim, na primeira página, a rota para casa, aproximadamente, e uma deve ser as rotas secundárias.
/ home deve ser renderizado no componente Frontpage e / admin / home deve ser renderizado no componente Back-end.
Tentei algumas variações, mas sempre acabei em não bater / home ou / admin / home.
Editar - 19.04.2017
Como este post tem muitas visualizações no momento, atualizei-o com a solução final. Eu espero que isso ajude alguém.
Edição - 05.05.2017
Soluções antigas removidas
Solução final:
Esta é a solução final que estou usando agora. Este exemplo também possui um componente de erro global, como uma 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.Respostas:
No react-router-v4 você não aninha
<Routes />
. Em vez disso, você os coloca dentro de outro<Component />
.Por exemplo
Deve se tornar
com
Aqui está um exemplo básico em linha reta do reagem-router documentação .
fonte
to="exampleTopicId"
com a${match.url}
estar implícito.react-router v6
Uma atualização para 2020: a próxima versão v6 terá
Route
componentes aninhados que Just Work ™. Veja o código de exemplo nesta postagem do blog .Enquanto a pergunta original é sobre a v4 / v5 , a resposta certa quando a v6 for enviada será apenas usar isso, se puder . Está atualmente em alfa.
react-router v4 & v5
É verdade que, para aninhar rotas, é necessário colocá-las no componente filho da rota.
No entanto, se você preferir uma sintaxe mais embutida, em vez de dividir suas rotas entre componentes, poderá fornecer um componente funcional ao
render
suporte da rota na qual deseja aninhar.Se você está interessado no motivo pelo qual o
render
suporte deve ser usado, e não nocomponent
suporte, é porque ele impede que o componente funcional inline seja remontado em cada renderização. Veja a documentação para mais detalhes.Observe que o exemplo agrupa as rotas aninhadas em um fragmento . Antes da reação 16, você pode usar um recipiente
<div>
.fonte
match.path
, nãomatch.url
. O primeiro é geralmente usado nopath
suporte da rota ; o último quando você empurra uma nova rota (por exemplo, Linkto
prop)Só queria mencionar que o react-router v4 mudou radicalmente desde que esta pergunta foi publicada / respondida.
Não há mais
<Match>
componente!<Switch>
é garantir que apenas a primeira correspondência seja renderizada.<Redirect>
bem .. redireciona para outra rota. Use ou deixe de foraexact
para excluir ou excluir uma correspondência parcial.Veja os documentos. Eles são ótimos. https://reacttraining.com/react-router/
Aqui está um exemplo que espero que seja útil para responder sua pergunta.
Espero que tenha ajudado, me avise. Se este exemplo não estiver respondendo bem à sua pergunta, diga-me e verei se posso modificá-la.
fonte
exact
emRedirect
reacttraining.com/react-router/web/api/Redirect Isso seria muito mais limpo do<Route exact path="/" render={() => <Redirect to="/path" />} />
que eu estou fazendo. Pelo menos não vai me deixar usar o TypeScript.Algo assim.
fonte
Eu consegui definir rotas aninhadas envolvendo
Switch
e definindo a rota aninhada antes da rota raiz.Referência: https://github.com/ReactTraining/react-router/blob/master/packages/react-router/docs/api/Switch.md
fonte
Você pode tentar algo como Routes.js
App.js
Eu acho que você pode conseguir o mesmo daqui também.
fonte
fonte