2

I am using ReactJS and have a form (component) that needs to redirect to another component, if the post request is successful. I have just started using react router, so this is the way I am trying to redirect.

import React, { Component } from 'react';
import { BrowserRouter as Router, Route, Redirect, Link } from 'react-router-dom';
import NextComponent from '/NextComponent';
import axios from 'axios';

class CurrentComponent extends Component {

constructor() {
    super();
    this.state = {
        value: ''
        redirect: false
    };
}

handleSubmit() {
    axios.post('xxx/yyy', {
        xxx: yyy
    })
    .then(function() {
        console.log('Success');
        this.setState({redirect: true});
    })
    .catch(function() {
        console.log('Error');
    });
}

render() {
    return(
        <div>
         <form>
          <div className="form-group">
           <input type="name" placeholder="name" />
          </div>
          <div className="form-group">
          <button type="button" onClick={this.handleSubmit.bind(this)} >Submit</button>
          {this.state.redirect &&
           <Redirect to={{
            pathname: '/nextcomponent',
            state: {from: this.state.value}
            }} />
          }
       </div>
         <Router>
           <Route path="/nextcomponent" component={NextComponent} />
         </Router>
        </form>
       </div>
    );
 }
}

export default PresentComponent;

It is not redirecting and I have been trying to figure this out. I am sure there are better solutions available, but due to my lack of knowledge I am unsure of implementing it. Any help is appreciated. Thank you.

Arpit Aggarwal
  • 27,626
  • 16
  • 90
  • 108
Annie
  • 23
  • 2
  • 4
  • I think the issue is that you are adding a state prop to the redirect, but based on the docs the redirect does not have a state prop. https://reacttraining.com/react-router/web/api/Redirect – Chaim Friedman May 22 '17 at 17:10
  • Yes thanks, I have changed most of the logic based of it, but because the examples are so concise. I am finding it difficult. – Annie May 23 '17 at 11:22

6 Answers6

1

This worked for my use case not sure about you. Try this -

<Route exact path="/some_url" render={() => (
  submitted ? (
    <Redirect to="/profile"/>
  ) : (
    <HomePage/>
  )
)}/>

Modify your logic or encapsulate it into <Route /> like in this example.

Nitin Tulswani
  • 309
  • 3
  • 5
1

If you're using react-router 4, history is available through context:

this.context.history.push('/some/Path');

So you'd modify your handleSubmit:

handleSubmit() {
    axios.post('xxx/yyy', {
        xxx: yyy
    })
    .then(function() {
        console.log('Success');
        this.context.history.push('/go/somewhere/else');
    })
    .catch(function() {
        console.log('Error');
    });
}

See this answer for other ways of altering history without conditional routing.

Ken Gregory
  • 7,180
  • 1
  • 39
  • 43
1

Probably you are not getting the state after post call, try modifying the handleSubmit method as:

handleSubmit() {
    let _this = this;
    axios.post('xxx/yyy', {
        xxx: yyy
    })
    .then(function() {
        console.log('Success');
        _this.setState({redirect: true});
    })
    .catch(function() {
        console.log('Error');
    });
}

Update as per new code:

class ComponentOne extends Component {

    constructor() {
        super();
        this.UpdateRoute= this.UpdateRoute.bind(this);
        this.state = {
            value: ''
        };
        this.loggedin = false;
    }

    const UpdateRoute = () => (
        <Router>
        <Route exact path="/xyz" render={() => (
          loggedin ? (
            <ComponentTwo />
          ) : (
            <ComponentOne />
          )
        )}/>
        </Router>
    )

    handleSubmit() {
        let _this = this;
        axios.post('/xyz', {
            xxx: yyy,
        })
        .then(function(response) {
            _this.loggedin = true;
            _this.UpdateRoute();
        })
        .catch(function() {
            console.log('Error');
        });
    }

    render() {
        return(
              <div>
            <h1>Load First</h1>
            <button type="button" onClick={this.handleSubmit.bind(this)}>Submit</button>
              </div>
        );
    }
}

export default ComponentOne;
Arpit Aggarwal
  • 27,626
  • 16
  • 90
  • 108
  • thanks, but with this method I was getting 2 components. I modified the code a bit.You can see it within this https://gist.github.com/anika-sharma/13c79cb40bd53c6e8f7afca634d9a5fb. But now on click the loggedin variable's value does not change. – Annie May 23 '17 at 12:54
  • @Annie check my updated answer also try looking at similar implementation here - https://aggarwalarpit.wordpress.com/2017/05/15/handling-events-in-react/ – Arpit Aggarwal May 23 '17 at 13:05
  • this.UpdateRoute= this.UpdateRoute.bind(this); gives an error cannot read property bind of undefined. – Annie May 23 '17 at 17:27
  • @Annie check updated answer, `UpdateRoute` should be defined in a component itself. – Arpit Aggarwal May 23 '17 at 17:41
  • Okay I have added it, but my server fails. I think defining a component within another component, causes this problem. – Annie May 23 '17 at 18:18
0

If you are using React-router-dom, then please check below given link.

https://reacttraining.com/react-router/web/example/auth-workflow

Kalim M Vazir
  • 109
  • 1
  • 2
0

Redirect is an export of react-router not react-router-dom. Therefore, you need to import it like:

import { Redirect } from 'react-router'

Redirect doc

Amir Hoseinian
  • 2,312
  • 2
  • 24
  • 27
0

Using react-router 2.8

I used the hashHistory from react-router to achieve this

import { hashHistory } from 'react-router';

then where I want to redirect:

hashHistory.push('/go/somewhere/else');
Michiel
  • 4,160
  • 3
  • 30
  • 42