-->

React router redirect after action redux

2019-03-08 18:14发布

问题:

I'm using react-redux and standard react-routing. I need redirect after definite action.

For example: I have registration a few steps. And after action:

function registerStep1Success(object) {
    return {
        type: REGISTER_STEP1_SUCCESS,
        status: object.status
   };
}

I want him redirect to page with registrationStep2. How to do it?

p.s. In history browser '/registrationStep2' has never been. This page appears only after successful result registrationStep1 page.

回答1:

With React Router 2+, wherever you dispatch the action, you can call browserHistory.push() (or hashHistory.push() if that’s what you use):

import { browserHistory } from 'react-router'

// ...
this.props.dispatch(registerStep1Success())
browserHistory.push('/registrationStep2')

You can do this from async action creators too if that is what you use.



回答2:

Have you checked out react-router-redux? This library makes it possible to sync react-router with redux.

Here is an example from the documentation of how you can implement the redirection with a push action from react-router-redux.

import { routerMiddleware, push } from 'react-router-redux'

// Apply the middleware to the store
const middleware = routerMiddleware(browserHistory)
const store = createStore(
  reducers,
  applyMiddleware(middleware)
)

// Dispatch from anywhere like normal.
store.dispatch(push('/foo'))


回答3:

To build on Eni Arinde previous answer's (I don't have the reputation to comment), here is how to use the store.dispatch method after an async action :

export function myAction(data) {
    return (dispatch) => {
        dispatch({
            type: ACTION_TYPE,
            data,
        }).then((response) => {
            dispatch(push('/my_url'));
        });
    };
}

The trick is to do it in the action files and not in the reducers, since reducers should not have side effects.



回答4:

You can use {withRouter} from 'react-router-dom'

Example below demonstrates a dispatch to push

export const registerUser = (userData, history) => {
  return dispatch => {
    axios
    .post('/api/users/register', userData)
    .then(response => history.push('/login'))
    .catch(err => dispatch(getErrors(err.response.data)));
  }
}

The history arguments is assigned to in the component as the a second parameter to the action creator (in this case 'registerUser')



回答5:

      signup = e => {
        e.preventDefault();
        const { username, fullname, email, password } = e.target.elements,
          { dispatch, history } = this.props,
          payload = {
            username: username.value,
            //...<payload> details here
          };
        dispatch(userSignup(payload, history));
        // then in the actions use history.push('/<route>') after actions or promises resolved.
      };

    render() {
       return (
       <SignupForm onSubmit={this.signup} />
        //... more <jsx/>
)
     }