Estou usando a última versão do módulo react-router, denominada react-router-dom, que se tornou o padrão ao desenvolver aplicativos da Web com o React. Quero saber como fazer um redirecionamento após uma solicitação POST. Eu tenho feito esse código, mas após a solicitação, nada acontece. Eu analiso na web, mas todos os dados são sobre versões anteriores do roteador de reação e não com a última atualização.
Código:
import React, { PropTypes } from 'react';
import ReactDOM from 'react-dom';
import { BrowserRouter } from 'react-router-dom';
import { Redirect } from 'react-router'
import SignUpForm from '../../register/components/SignUpForm';
import styles from './PagesStyles.css';
import axios from 'axios';
import Footer from '../../shared/components/Footer';
class SignUpPage extends React.Component {
constructor(props) {
super(props);
this.state = {
errors: {},
client: {
userclient: '',
clientname: '',
clientbusinessname: '',
password: '',
confirmPassword: ''
}
};
this.processForm = this.processForm.bind(this);
this.changeClient = this.changeClient.bind(this);
}
changeClient(event) {
const field = event.target.name;
const client = this.state.client;
client[field] = event.target.value;
this.setState({
client
});
}
async processForm(event) {
event.preventDefault();
const userclient = this.state.client.userclient;
const clientname = this.state.client.clientname;
const clientbusinessname = this.state.client.clientbusinessname;
const password = this.state.client.password;
const confirmPassword = this.state.client.confirmPassword;
const formData = { userclient, clientname, clientbusinessname, password, confirmPassword };
axios.post('/signup', formData, { headers: {'Accept': 'application/json'} })
.then((response) => {
this.setState({
errors: {}
});
<Redirect to="/"/> // Here, nothings happens
}).catch((error) => {
const errors = error.response.data.errors ? error.response.data.errors : {};
errors.summary = error.response.data.message;
this.setState({
errors
});
});
}
render() {
return (
<div className={styles.section}>
<div className={styles.container}>
<img src={require('./images/lisa_principal_bg.png')} className={styles.fullImageBackground} />
<SignUpForm
onSubmit={this.processForm}
onChange={this.changeClient}
errors={this.state.errors}
client={this.state.client}
/>
<Footer />
</div>
</div>
);
}
}
export default SignUpPage;
javascript
reactjs
react-router
maoooricio
fonte
fonte
Redirect
parece JSX, não JS.Respostas:
Você precisa usar
setState
para definir uma propriedade que renderizará o<Redirect>
interior do seurender()
método.Por exemplo
Você também pode ver um exemplo na documentação oficial: https://reacttraining.com/react-router/web/example/auth-workflow
Dito isso, sugiro que você coloque a chamada da API em um serviço ou algo assim. Então você pode simplesmente usar o
history
objeto para rotear programaticamente. É assim que a integração com o redux funciona.Mas acho que você tem seus motivos para fazê-lo dessa maneira.
fonte
put the API call inside a service or something
:?componentDidMount
. Ou melhor ainda, crie um HOC que "envolva" sua API.Redirect
está chamandohistory.replace
. Se você deseja acessar ohistory
objeto, usewithRoutet
/Route
.react-router
> = 5.1 inclui agora ganchos, então você pode apenasconst history = useHistory(); history.push("/myRoute")
Aqui, um pequeno exemplo de resposta ao título, como todos os exemplos mencionados, é complicado na minha opinião e também o oficial.
Você deve saber como transpilar o es2015 e tornar seu servidor capaz de lidar com o redirecionamento. Aqui está um trecho para expressar. Mais informações relacionadas a isso podem ser encontradas aqui .
Coloque isso abaixo de todas as outras rotas.
Este é o arquivo .jsx. Observe como o caminho mais longo vem primeiro e fica mais geral. Para as rotas mais gerais, use o atributo exato.
fonte
home/hello
>,home/hello/1
mas vá parahome/hello
e pressione Enter, ele não será redirecionado pela primeira vez. alguma idéia por que ??Basta chamá-lo dentro de qualquer função que desejar.
fonte
O React Router v5 agora permite que você simplesmente redirecione usando history.push () graças ao gancho useHistory () :
fonte
Tente algo assim.
fonte
Como alternativa, você pode usar
withRouter
. Você pode obter acesso aohistory
propriedades do objeto e os mais próximos<Route>
'smatch
através dawithRouter
componente de ordem superior.withRouter
passará atualizadomatch
,location
ehistory
props para o componente agrupado sempre que renderizado.Ou apenas:
fonte
você pode escrever um hoc para esse fim e escrever um redirecionamento de chamada de método, eis o código:
fonte
Para navegar para outra página (página Sobre, no meu caso), instalei
prop-types
. Eu o importo no componente correspondente e useithis.context.router.history.push('/about')
. E ele é navegado.Meu código é
fonte
Para navegar para outro componente, você pode usar
this.props.history.push('/main');
fonte
Warning: Cannot update during an existing state transition (such as within
render #). Render methods should be a pure function of props and state.
A solução mais simples para navegar para outro componente é (o exemplo navega para o componente de e-mails clicando no ícone):
fonte
Como alternativa, você pode usar Reagir renderização condicional.
fonte