Navegar programmaticamente usando o roteador de reação
Com o react-router
eu posso utilizar o elemento Link
para criar links que são nativamente manuseados pelo router de reacção.
Vejo internamente que chama 'this.context.transitionTo(...)`.
Quero fazer uma navegação, mas não a partir de um link, a partir de uma seleção suspensa, por exemplo. Como posso fazer isso em código? O que é "this.context"?
Eu vi a mistura "Navegação", mas posso fazer isto sem misturas?
1245
3
Você pode utilizar o novo gancho
useHistory
em Componentes Funcionais e Navegar Programmaticamente:No 4.0 e acima, use o histórico como um adereço do seu componente.
NOTA: este.histórico não existe no caso do seu componente não ter sido renderizado por
. Você deve utilizar
para ter este.histórico.props.history em SeuComponenteNo 3.0 e acima, use o roteador como um adereço do seu componente.
Em 2.4 e acima, use um componente de ordem superior para obter o roteador como um adereço do seu componente.
Esta versão é retrocompatível com a 1.x, portanto não há necessidade de um Guia de Atualização. Apenas analisar os exemplos deve ser suficientemente bom.
Dito isto, se você quiser mudar para o novo padrão, há um módulo browserHistory dentro do roteador que você pode acessar com
Importar { browserHistory } de 'react-router'``.
Agora você tem acesso ao histórico do seu navegador, assim você pode fazer coisas como empurrar, substituir, etc... Como por exemplo:
BrowserHistory.push('/some/path')`
Leitura adicional: Histórias e Navegação
Eu não vou entrar em detalhes de atualização. Você pode ler sobre isso no Guia de Atualização
A principal mudança sobre a questão aqui é a mudança do Mixin de Navegação para a História. Agora está utilizando o histórico do navegadorAPI para mudar a rota, então vamos utilizar
pushState()
a partir de agora.Aqui está um exemplo usando o Mixin:
Note que esta
História
vem do projeto rackt/história. Não do próprio React-Router.Se você não quiser usar o Mixin por alguma razão (talvez por causa da classe ES6), então você pode acessar o histórico que você obtém do roteador do
this.props.history
. Ele só será acessível para os componentes renderizados pelo seu Roteador. Então, se você quiser utilizá-lo em qualquer componente infantil, ele precisa ser passado como um atributo viaprops
.Você pode ler mais sobre o novo lançamento em sua 1.0.x documentação
Aqui está uma página de ajuda específica sobre como navegar fora do seu componente
Ele recomenda pegar uma referência
history = createHistory()
e chamarreplaceState
sobre isso.Eu entrei no mesmo problema e só consegui encontrar a solução com o mixin de Navegação que vem com o re-roteador.
Eis como eu o fiz
Eu pude chamar
transiçãoPara()
sem a necessidade de acessar `.contextual''.Ou você pode tentar a "classe" ES6
React-Router-Redux tem alguns métodos disponíveis que permitem a simples navegação a partir de criadores de ação interna. Estes podem ser particularmente úteis para pessoas que têm arquitetura existente no React Native, e desejam utilizar os mesmos padrões no React Web com o mínimo de caldeiraria.
Explore os seguintes métodos:
push(location)
goBack()
Aqui está um exemplo de uso, com Redux-Thunk:
**./actioncreators.js***
**./viewcomponent.js***
Para o lançamento mais recente (
v2.0.0-rc5
), o método de navegação recomendado é empurrando diretamente para o botão de histórico. Você pode ver isso em ação no arquivo Navigating outside of Components doc.Extrato relevante:
Se estiver utilizando o novo API do reator-router, você precisa fazer uso da
history
dothis.props
quando dentro dos componentes assim:Ele também oferece
pushState
mas que é depreciado por avisos logados.Se utilizar o
react-router-redux', oferece uma função
push' que pode ser despachada assim:No entanto, isto só pode ser usado para alterar a URL, não para navegar realmente para a página.
Você pode fazer isso sem misturas também.
O que se tem com contextos é que não é acessível a menos que você defina os `contextosTipos' na classe.
Quanto ao contexto, é um objeto, como os adereços, que são passados de pais para filhos, mas que é passado implicitamente, sem que seja preciso redeclarar os adereços cada vez. Ver https://www.tildedave.com/2014/11/15/introduction-to-contexts-in-react-js.html