Na versão atual do React Router (v3), posso aceitar uma resposta do servidor e usar browserHistory.push
para ir para a página de resposta apropriada. No entanto, isso não está disponível na v4 e não tenho certeza de qual é a maneira apropriada de lidar com isso.
Neste exemplo, usando o Redux, components / app-product-form.js chama this.props.addProduct(props)
quando um usuário envia o formulário. Quando o servidor retorna com sucesso, o usuário é levado para a página Carrinho.
// actions/index.js
export function addProduct(props) {
return dispatch =>
axios.post(`${ROOT_URL}/cart`, props, config)
.then(response => {
dispatch({ type: types.AUTH_USER });
localStorage.setItem('token', response.data.token);
browserHistory.push('/cart'); // no longer in React Router V4
});
}
Como posso redirecionar para a página Carrinho da função React Router v4?
context
para passar o que você precisa manualmente é um "não-vá". A menos que eu seja um autor de biblioteca, não deve haver necessidade de usá-lo. De fato, o Facebook recomenda contra isso.history
também funciona para o React Native como uma opção, além de uma opção adicional de suporte a navegadores herdados.Respostas:
Você pode usar os
history
métodos fora dos seus componentes. Tente da seguinte maneira.Primeiro, crie um
history
objeto usado no pacote de histórico :Em seguida, envolva-o
<Router>
( observe , você deve usar emimport { Router }
vez deimport { BrowserRouter as Router }
):Altere sua localização atual de qualquer lugar, por exemplo:
UPD : Você também pode ver um exemplo um pouco diferente nas Perguntas frequentes sobre o React Router .
fonte
history.push('some path')
o URL muda, mas a página não muda. Eu tenho que colocá-window.location.reload()
lo em algumas partes do meu código apenas para fazê-lo funcionar. No entanto, em um exemplo, eu tenho que manter a árvore de estado redux, e recarregar a destrói. Alguma outra solução?withRouter
componente de ordem superior.import createHistory from 'history/createBrowserHistory'; export default createHistory();
seja trabalho.O React Router v4 é fundamentalmente diferente da v3 (e anterior) e você não pode fazer o
browserHistory.push()
que costumava fazer.Esta discussão parece relacionada se você quiser obter mais informações:
Em vez disso, você tem algumas opções para fazer isso:
Use o
withRouter
componente de alta ordemEm vez disso, você deve usar o
withRouter
componente de ordem superior e agrupá-lo no componente que será enviado ao histórico. Por exemplo:Confira a documentação oficial para mais informações:
Use a
context
APIUsar o contexto pode ser uma das soluções mais fáceis, mas, sendo uma API experimental, é instável e sem suporte. Use-o apenas quando tudo mais falhar. Aqui está um exemplo:
Veja a documentação oficial sobre o contexto:
fonte
this.context.router.history.push('/path');
Agora, com o react-router v5, você pode usar o gancho de ciclo de vida useHistory como este:
leia mais em: https://reacttraining.com/react-router/web/api/Hooks/usehistory
fonte
let history = useHistory();
mas obtendo umObject is not callable
erro, quando tentei ver o que useHistory éconsole.log(useHistory)
mostrado como indefinido. usando"react-router-dom": "^5.0.1"
A maneira mais simples do React Router 4 é usar
Mas, para usar esse método, seu componente existente deve ter acesso ao
history
objeto. Podemos ter acesso porSe o seu componente estiver vinculado
Route
diretamente, ele já terá acesso aohistory
objeto.por exemplo:
Aqui
ViewProfile
tem acesso ahistory
.Se não estiver conectado
Route
diretamente.por exemplo:
Então temos que usar
withRouter
uma função de ordem superior para distorcer o componente existente.ViewUsers
Componente internoimport { withRouter } from 'react-router-dom';
export default withRouter(ViewUsers);
É isso agora, seu
ViewUsers
componente tem acesso aohistory
objeto.ATUALIZAR
2
- nesse cenário, passe toda a rotaprops
para o seu componente e, em seguida, podemos acessar athis.props.history
partir do componente mesmo sem umHOC
por exemplo:
fonte
this.props.history
) vem de um HOC, o que significa que ele não está diretamente vinculado aoRoute
, como você explica.Foi assim que eu fiz:
Use
this.props.history.push('/cart');
para redirecionar para a página do carrinho, ela será salva no objeto histórico.Aproveite Michael.
fonte
De acordo com a documentação do React Router v4 - sessão Redux Deep Integration
É necessária uma profunda integração para:
No entanto, eles recomendam essa abordagem como uma alternativa à "profunda integração":
Assim, você pode agrupar seu componente com o componente de alta ordem withRouter:
export default withRouter(connect(null, { actionCreatorName })(ReactComponent));
que passará a API do histórico para adereços. Assim, você pode ligar para o criador da ação, passando o histórico como um parâmetro. Por exemplo, dentro do seu ReactComponent:
Em seguida, dentro de actions / index.js:
fonte
Questão desagradável, demorou bastante tempo, mas acabei resolvendo assim:
Envolva seu contêiner
withRouter
e passe o histórico para sua ação emmapDispatchToProps
função. Em ação, use history.push ('/ url') para navegar.Açao:
Recipiente:
Isso é válido para Reagir Router v4.x .
fonte
import { createBrowserHistory } from 'history'
por favor?this.context.history.push
não funciona.Eu consegui empurrar trabalhando assim:
fonte
Nesse caso, você está passando adereços para o seu thunk. Então você pode simplesmente ligar
Se não for esse o caso, você ainda pode passar o histórico do seu componente
fonte
Eu ofereço mais uma solução, caso valha a pena para outra pessoa.
Eu tenho um
history.js
arquivo em que tenho o seguinte:Em seguida, na minha raiz, onde defino meu roteador, uso o seguinte:
Finalmente, no meu
actions.js
importo o History e uso o pushLaterDessa forma, eu posso avançar para novas ações após chamadas de API.
Espero que ajude!
fonte
Se você estiver usando o Redux, recomendo usar o pacote npm react -router-redux . Permite enviar ações de navegação da loja Redux.
Você precisa criar uma loja conforme descrito no arquivo Leiame .
O caso de uso mais fácil:
Segundo caso de uso com contêiner / componente:
Recipiente:
Componente:
fonte
next
versão, que ainda está em desenvolvimento no momento!Consegui fazer isso usando
bind()
. Eu queria clicar em um botãoindex.jsx
, postar alguns dados no servidor, avaliar a resposta e redirecionar parasuccess.jsx
. Aqui está como eu resolvi isso ...index.jsx
:request.js
:success.jsx
:Assim, através da ligação
this
apostData
noindex.jsx
, eu era capaz de acessothis.props.history
emrequest.js
... então eu posso reutilizar esta função em diferentes componentes, apenas tem que ter certeza que eu lembre-se de incluirthis.postData = postData.bind(this)
naconstructor()
.fonte
Aqui está o meu hack (este é o meu arquivo de nível raiz, com um pouco de redux misturado lá - embora eu não esteja usando
react-router-redux
):Posso então usar o local
window.appHistory.push()
que quiser (por exemplo, em minhas funções de loja redux / thunks / sagas, etc) que eu esperava poder usar,window.customHistory.push()
mas, por algum motivo,react-router
nunca parecia atualizar, mesmo que o URL mudasse. Mas desta forma eu tenho a instância EXACTreact-router
usa. Eu não amo colocar coisas no escopo global, e essa é uma das poucas coisas com as quais eu faria isso. Mas é melhor do que qualquer outra alternativa que eu já vi na IMO.fonte
Use retorno de chamada. Funcionou para mim!
No componente, basta adicionar o retorno de chamada
fonte
então, da maneira que faço, é: - em vez de redirecionar usando
history.push
, apenas uso oRedirect
componente dereact-router-dom
Ao usar esse componente, você pode simplesmente passarpush=true
e ele cuidará do restofonte
O React Router V4 agora permite que o suporte de histórico seja usado como abaixo:
O valor pode ser acessado sempre que a localização prop estiver disponível como
state:{value}
estado não componente.fonte
você pode usá-lo assim, como faço para fazer login e muitas coisas diferentes
fonte
fonte
primeiro passo, envolva seu aplicativo no roteador
Agora todo o meu aplicativo terá acesso ao BrowserRouter. Etapa 2: Importo o Route e, em seguida, passo os adereços. Provavelmente em um dos seus arquivos principais.
Agora, se eu executar o console.log (this.props) no meu arquivo js componente, devo obter algo parecido com isto
Etapa 2 Posso acessar o objeto histórico para alterar minha localização
Além disso, sou apenas um estudante de código de inicialização, então não sou especialista, mas sei que você também pode usar
Corrija-me se eu estiver errado, mas quando testei, recarreguei a página inteira, o que pensei ter derrotado o ponto inteiro de usar o React.
fonte
Crie uma customização
Router
própriabrowserHistory
:Em seguida, na sua raiz onde você a define
Router
, use o seguinte:Por fim, importe
history
onde você precisar e use:fonte
Se você deseja usar o histórico ao passar uma função como um valor para o suporte de um componente, com o react-router 4, você pode simplesmente desestruturar o
history
suporte no atributo de renderização do<Route/>
componente e usarhistory.push()
Nota: Para que isso funcione, você deve agrupar o Componente BrowserRouter do React Router em torno do seu componente raiz (por exemplo, que pode estar em index.js)
fonte