Estoy usando la última versión del módulo react-router, llamado react-router-dom, que se ha convertido en el predeterminado al desarrollar aplicaciones web con React. Quiero saber cómo realizar una redirección después de una solicitud POST. He estado creando este código, pero después de la solicitud, no pasa nada. Reviso en la web, pero todos los datos son sobre versiones anteriores del enrutador react, y no con la última actualización.
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
fuente
fuente

Redirectmiradas como JSX, no JS.Respuestas:
Tienes que usar
setStatepara establecer una propiedad que renderice el<Redirect>interior de turender()método.P.ej
También puede ver un ejemplo en la documentación oficial: https://reacttraining.com/react-router/web/example/auth-workflow
Dicho esto, te sugiero que pongas la llamada API dentro de un servicio o algo. Entonces podría usar el
historyobjeto para enrutar programáticamente. Así es como funciona la integración con redux .Pero supongo que tienes tus razones para hacerlo de esta manera.
fuente
put the API call inside a service or something:?componentDidMount. O incluso mejor, cree un HOC que "envuelva" su API.Redirectestá llamandohistory.replace. Si desea acceder alhistoryobjeto, usewithRoutet/Route.react-router> = 5.1 ahora incluye ganchos, por lo que puede simplementeconst history = useHistory(); history.push("/myRoute")Aquí un pequeño ejemplo como respuesta al título ya que todos los ejemplos mencionados son complicados en mi opinión al igual que el oficial.
Debe saber cómo transpilar es2015 y hacer que su servidor pueda manejar la redirección. Aquí hay un fragmento de expreso. Puede encontrar más información relacionada con esto aquí .
Asegúrese de poner esto debajo de todas las demás rutas.
Este es el archivo .jsx. Observe cómo el camino más largo viene primero y se vuelve más general. Para las rutas más generales, utilice el atributo exacto.
fuente
home/hello>home/hello/1pero luego vaya ahome/helloy presione Intro, no se redirigirá la primera vez. alguna idea por qué?Simplemente llámelo dentro de cualquier función que desee.
fuente
React Router v5 ahora le permite simplemente redirigir usando history.push () gracias al gancho useHistory () :
fuente
Prueba algo como esto.
fuente
Alternativamente, puede usar
withRouter. Usted puede obtener acceso a lahistorypropiedades de los objetos y los más cercanos<Route>'smatcha través delwithRoutercomponente de orden superior.withRouterpasará los accesorios actualizadosmatch,locationyhistoryal componente envuelto siempre que se procese.O solo:
fuente
puede escribir un hoc para este propósito y escribir una redirección de llamada de método, aquí está el código:
fuente
Para navegar a otra página (página Acerca de en mi caso), instalé
prop-types. Luego lo importo en el componente correspondiente.this.context.router.history.push('/about')Y lo usé . Y se navega.Mi código es
fuente
Para navegar a otro componente, puede usar
this.props.history.push('/main');fuente
Warning: Cannot update during an existing state transition (such as withinrender). Render methods should be a pure function of props and state.La solución más sencilla para navegar a otro componente es (el ejemplo navega al componente de correos haciendo clic en el icono):
fuente
Alternativamente, puede usar la representación condicional de React.
fuente