Hay algún cambio en react-router?, al intentar el <code>this.props.history.push('/badges'); &lt;code&gt; </code> No me redirige

Giovanny Andres Palacios Cuartas

Giovanny Andres Palacios Cuartas

Pregunta
student
hace 5 años

Hay algún cambio en react-router?, al intentar el

this.props.history.push('/badges'); <code>
No me redirige

2 respuestas
    Yorman José Rodríguez Moreno

    Yorman José Rodríguez Moreno

    student
    hace 5 años

    Buenas bro! a mi me pasaba algo similar, al oprimir el botón me salio un error que "history" no estaba definido. Lo que pasa, es que dentro de Route yo no coloque component={BadgeNew} sino que lo puse como un hijo. Solo debes ponerlo como en clase component={BadgeNew} para que te redirija sin error. Espero este sea tu problema y te haya podido ayudar.

    Marc Sánchez Díaz

    Marc Sánchez Díaz

    student
    hace 5 años

    A mi me pasaba lo mismo y parte del problema es lo que comenta Yorman.

    Cuando defines el componente a renderizar para una ruta concreta, se puede hacer de 4 maneras. La que Richard explica en el curso es:

    ... <Route exact path='/badges/new' component={BadgeNew} /> ...

    De esta forma a

    <BadgeNew />
    se le pasa como
    props
    :
    match
    ,
    location
    y
    history
    . Además habría otra dos formas que también pasarían esos mismos
    props
    . Pero hay una forma de hacerlo con la que eso no sucede:

    ... <Route exact path='/badges/new'> <BadgeNew /> </Route> ...

    Según la documentación de

    react-router
    (en inglés), este último método es el recomendado (ellos lo explican el primero).

    Entonces, para navegar desde un componente que se ha declarado como hijo de un

    Route
    , ¿Qué podemos hacer? Básicamente hay dos opciones:

    Opción 1: usar
    withRoute

    Al exportar el componente con withRoute, como en el codigo que sigue...

    ... import { withRouter } from 'react-router-dom' ... class BadgeNew extends React.Component { //Aquí todo el código del componente // y finalmente... } export default withRouter(BadgeNew);

    ... tengo disponible en el código del componente

    match
    ,
    location
    y
    history
    , con lo que ya podría navegar como nos explica Richard con:

    this.props.history.push('/badges');

    Opción 2: usar
    <Redirect />
    (la que prefiero)

    En este articulo está muy bien explicado (en inglés) y básicamente consiste en definir una nueva varible para saber si hay que navegar o no, y en el render, actuar en consecuencia y navegar por medio de un

    Redirect
    . El código quedaria más o menos así:

    ... import { Redirect } from 'react-router-dom' ... class BadgeNew extends React.Component { state = { volvemos: false, ... //En handleSubmit, tras recibir la llamada de la api, no solo indicamos que ya no cargamos, sino que podemos volver (o ir a otro sitio, por ejemplo si fuera un formulario multipagina. this.setState({loading: false, volvemos: true }); // y en el render, igual que tratamos con el loading o los errores, hacemos la navegación, cuando es el momento render () { if (this.state.volvemos) { return <Redirect to='/badges' /> } ...

    Espero que os sirva, a mi me ha llevado unas cuantas horas dar con todo esto, pero con lo que he aprendido ha valido la pena!

Curso de React.js [Empieza Gratis]

Curso de React.js [Empieza Gratis]

React es una de las librerías más utilizadas hoy para crear aplicaciones web. Aprende desde la creación y diseño de componentes hasta traer datos de un API. Desarrolla aplicaciones web de muy alta calidad en tiempo record con React.js

Curso de React.js [Empieza Gratis]
Curso de React.js [Empieza Gratis]

Curso de React.js [Empieza Gratis]

React es una de las librerías más utilizadas hoy para crear aplicaciones web. Aprende desde la creación y diseño de componentes hasta traer datos de un API. Desarrolla aplicaciones web de muy alta calidad en tiempo record con React.js