webentwicklung-frage-antwort-db.com.de

Reagieren Sie die Router-Weiterleitung nach der Aktion redux

Ich verwende React-Redux und Standard-React-Routing. Ich muss nach einer bestimmten Aktion umleiten.

Zum Beispiel: Ich habe ein paar Schritte zur Registrierung. Und nach der Aktion:

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

Ich möchte, dass er auf page mit registrationStep2 umleitet. Wie es geht?

p.s. Im Verlaufsbrowser war '/ registrationStep2' noch nie. Diese Seite erscheint nur nach erfolgreicher Ergebnisregistrierung.

35
ximet

Mit React Router 2+ können Sie, wo auch immer Sie die Aktion absenden, browserHistory.Push() (oder hashHistory.Push(), falls Sie dies verwenden) aufrufen:

import { browserHistory } from 'react-router'

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

Sie können dies auch von asynchronen Aktionserstellern durchführen, wenn Sie dies verwenden.

47
Dan Abramov

Hast du React-Router-Redux ausgecheckt? Diese Bibliothek ermöglicht die Synchronisation des Reakt-Routers mit dem Redux. 

Hier ein Beispiel aus der Dokumentation, wie Sie die Umleitung mit einer Push-Aktion von React-Router-Redux implementieren können.

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'))
20
Eni Arinde

Einfachste Lösung für Router ab Version 4:

exportieren Sie den Browserverlauf von dem Ort, an dem er initialisiert wurde, und verwenden Sie browserHistory.Push ('/ pathToRedirect'):

Der Paketverlauf muss installiert sein (Beispiel: "history": "4.7.2"):

npm install --save history

In meinem Projekt initialisiere ich den Browserverlauf in index.js:

import { createBrowserHistory } from 'history';

export const browserHistory = createBrowserHistory();

In der Aktion umleiten:

export const actionName = () => (dispatch) => {
    axios
            .post('URL', {body})
            .then(response => {
                // Process success code
                  dispatch(
                    {
                      type: ACTION_TYPE_NAME,
                      payload: payload
                    }
                  );
                }
            })
            .then(() => {
                browserHistory.Push('/pathToRedirect')
            })
            .catch(err => {
                // Process error code
                    }
                );
            });
};
4
Jackkobec

Um auf den vorherigen Antworten von Eni Arinde aufzubauen (ich habe nicht den Ruf, einen Kommentar abzugeben), verwenden Sie die store.dispatch-Methode nach einer asynchronen Aktion:

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

Der Trick besteht darin, dies in den Aktionsdateien und nicht in den Reduzierern zu tun, da Reduzierungen keine Nebenwirkungen haben sollten.

4
Mathieu Nohet

Hier ist die funktionierende Kopie Routing-App

    import {history, config} from '../../utils'
        import React, { Component } from 'react'
        import { Provider } from 'react-redux'
        import { createStore, applyMiddleware } from 'redux'
        import Login from './components/Login/Login';
        import Home from './components/Home/Home';
        import reducers from './reducers'
        import thunk from 'redux-thunk'

        import {Router, Route} from 'react-router-dom'

        import { history } from './utils';

        const store = createStore(reducers, applyMiddleware(thunk))



        export default class App extends Component {
          constructor(props) {
            super(props);

            history.listen((location, action) => {
              // clear alert on location change
              //dispatch(alertActions.clear());
            });
          }
          render() {
            return (
              <Provider store={store}>
                <Router history={history}>
                  <div>
                    <Route exact path="/" component={Home} />
                    <Route path="/login" component={Login} />
                  </div>
                </Router>
              </Provider>
            );
          }
        }

export const config = {
    apiUrl: 'http://localhost:61439/api'
};
import { createBrowserHistory } from 'history';

    export const history = createBrowserHistory();
//index.js
export * from './config';
export * from './history';
export * from './Base64';
export * from './authHeader';

import { SHOW_LOADER, AUTH_LOGIN, AUTH_FAIL, ERROR, AuthConstants } from './action_types'

import Base64 from "../utils/Base64";

import axios from 'axios';
import {history, config, authHeader} from '../utils'
import axiosWithSecurityTokens from '../utils/setAuthToken'


export function SingIn(username, password){


    return async (dispatch) => {
      if(username == "gmail"){
        onSuccess({username:"Gmail"}, dispatch);
      }else{
      dispatch({type:SHOW_LOADER, payload:true})
        let auth = {
            headers: {
              Authorization: 'Bearer ' + Base64.btoa(username + ":" + password)
            }
          }
        const result = await axios.post(config.apiUrl + "/Auth/Authenticate", {}, auth);
        localStorage.setItem('user', result.data)
        onSuccess(result.data, dispatch);
    }
  }

}

export function GetUsers(){
  return async (dispatch) => {
var access_token = localStorage.getItem('userToken');
    axios.defaults.headers.common['Authorization'] = `Bearer ${access_token}` 

    var auth = {
      headers: authHeader()
    }
    debugger
      const result = await axios.get(config.apiUrl + "/Values", auth);
      onSuccess(result, dispatch);
      dispatch({type:AuthConstants.GETALL_REQUEST, payload:result.data})
  }
}



const onSuccess = (data, dispatch) => {

  const {username} = data;
  //console.log(response);
  if(username){
    dispatch({type:AuthConstants.LOGIN_SUCCESS, payload: {Username:username }});
    history.Push('/');
    // Actions.DashboardPage();
  }else{
    dispatch({ type: AUTH_FAIL, payload: "Kullanici bilgileri bulunamadi" });
  }
  dispatch({ type: SHOW_LOADER, payload: false });
}
const onError = (err, dispatch) => {
  dispatch({ type: ERROR, payload: err.response.data });
  dispatch({ type: SHOW_LOADER, payload: false });
}

export const SingInWithGmail = () => {
  return { type :AuthConstants.LOGIN_SUCCESS}
}

export const SignOutGmail = () => {
  return { type :AuthConstants.LOGOUT}
}
0

      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/>
)
     }

0
Saad Abbasi

Sie können { withRouter } von 'response-router-dom' verwenden.

Das folgende Beispiel zeigt einen Versand an 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)));
  }
}

Die historischen Argumente werden in der Komponente dem Aktionsersteller als zweiter Parameter zugewiesen (in diesem Fall 'registerUser').

0
milesr