Eu sou novo no React Router e aprendi que existem muitas maneiras de redirecionar uma página:
Usando
browserHistory.push("/path")
import { browserHistory } from 'react-router'; //do something... browserHistory.push("/path");
Usando
this.context.router.push("/path")
class Foo extends React.Component { constructor(props, context) { super(props, context); //do something... } redirect() { this.context.router.push("/path") } } Foo.contextTypes = { router: React.PropTypes.object }
No React Router v4, existe
this.context.history.push("/path")
ethis.props.history.push("/path")
. Detalhes: como enviar para o histórico no React Router v4?
Estou tão confuso com todas essas opções. Existe uma melhor maneira de redirecionar uma página?
reactjs
redux
react-router
Liutong Chen
fonte
fonte
withRouter
Respostas:
Na verdade, depende do seu caso de uso.
1) Você deseja proteger sua rota de usuários não autorizados
Se for esse o caso, você pode usar o componente chamado
<Redirect />
e pode implementar a seguinte lógica:Lembre-se de que, se quiser
<Redirect />
trabalhar da maneira esperada, você deve colocá-lo dentro do método de renderização do seu componente para que seja eventualmente considerado um elemento DOM, caso contrário, não funcionará.2) Você deseja redirecionar após uma determinada ação (digamos, após criar um item)
Nesse caso, você pode usar o histórico:
ou
Para ter acesso ao histórico, você pode envolver seu componente com um HOC chamado
withRouter
. Quando você envolve seu componente com ele, ele passamatch
location
ehistory
adere. Para obter mais detalhes, consulte a documentação oficial do withRouter .Se o componente é um filho de um
<Route />
componente, ou seja, se é algo como<Route path='/path' component={myComponent} />
, você não tem que envolver seu componente comwithRouter
, porque<Route />
passesmatch
,location
ehistory
ao seu filho.3) Redirecionar após clicar em algum elemento
Existem duas opções aqui. Você pode usá-
history.push()
lo passando para umonClick
evento:ou você pode usar um
<Link />
componente:Acho que a regra neste caso é tentar usar
<Link />
primeiro, suponho que especialmente por causa do desempenho.fonte
history
em seus props poder fazerthis.props.history.push('/path')
, significa que o componente é filho de<Route/>
ou temwithRouter
wrapper na exportação correto?<Route path='/path' component={Comp}/>
, acho que simplesmenterender() { return <Comp/>}
em uma condição?this.props.history
mas não tenho certeza se acertei sua segunda pergunta? O que você quer dizer exatamente comroute to another component
?Agora, com o react-router
v15.1
e em diante, podemosuseHistory
ligar, Esta é uma forma super simples e clara. Aqui está um exemplo simples do blog de origem.Você pode usar isso em qualquer componente funcional e ganchos personalizados. E sim, isso não funcionará com componentes de classe como qualquer outro gancho.
Saiba mais sobre isso aqui https://reacttraining.com/blog/react-router-v5-1/#usehistory
fonte
Você também pode usar a biblioteca react router dom useHistory;
https://reactrouter.com/web/api/Hooks/usehistory
fonte
Uma das maneiras mais simples: use o Link da seguinte maneira:
Se quisermos cobrir toda a seção div como link:
fonte
Você também pode fazer
Redirect
oRoute
seguinte. Isso é para lidar com rotas inválidas.fonte