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
Redirect
miradas como JSX, no JS.Respuestas:
Tienes que usar
setState
para 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
history
objeto 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.Redirect
está llamandohistory.replace
. Si desea acceder alhistory
objeto, 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/1
pero luego vaya ahome/hello
y 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 lahistory
propiedades de los objetos y los más cercanos<Route>
'smatch
a través delwithRouter
componente de orden superior.withRouter
pasará los accesorios actualizadosmatch
,location
yhistory
al 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 within
render). 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