Where to dispatch multiple actions in redux?

前端 未结 7 1578
终归单人心
终归单人心 2021-01-31 08:10

I am using redux with connect and redux-thunk middleware and containers.

Currently when an user perform an action, example one click on a butto

相关标签:
7条回答
  • 2021-01-31 08:44

    For guys in 2020... The actions are Supposed to be made in the action Creater. For those who would like to dispatch an action and fetch/post some data from the API can use this Idea.

    lets assume we have an actions.js file and we want to dispatch a loading action before fetch data.

    function requestPosts() {
        return {
          type: "loading"
        }
      }
    

    This is the fetching action function

    function fetchPosts() {
     return dispatch => {
        // dispatch the loading
        dispatch(requestPosts());
        // fetch data from api
      return fetch("https://www.yoururl.com/api")
       .then(response => response.json())
       .then(json => dispatch({
           type: "fetching successful",
           payload: json
        }));
      }
    }
    
    0 讨论(0)
  • 2021-01-31 08:48

    As other pointed out The action creator is the right place for dispatching multiple actions.

    Below an example of how action1 could dispatch other actions in your action creator.

    const action1 = id => {
      return dispatch => {
        dispatch(action2(id))
        dispatch(action3(id))
      }
    }
    
    0 讨论(0)
  • 2021-01-31 08:51

    The easiest way is to use a specialized middleware redux-soldier:

    import { createStore, applyMiddleware } from 'redux'
    import { reduxSoldierMiddleware } from 'redux-soldier'
    
    const store = createStore(rootReducer, applyMiddleware(reduxSoldierMiddleware))
    store.dispatch([
      {type: 'INCREMENT'}, // traditional action
      addTodo('Start using redux-soldier'), // action creator
      fetchUser(), // thunk action
    ])
    

    redux-soldier is also a full replacement for redux-thunk

    For more info check the documentation redux-soldier.

    0 讨论(0)
  • 2021-01-31 08:55

    The action creator is the correct location for dispatching multiple actions. Although code like the following would work:

    function actionCreator(payload) {
        return dispatch => {
            dispatch(action1(payload))
            dispatch(action2(payload))
        }
    }
    

    I would highly recommend redux-thunk based action creators to always return a resolved Promise, so that such action creators can be part of another async call. So, the simplest update to the above would be:

    function actionCreator(payload) {
        return dispatch => {
            dispatch(action1(payload));
            dispatch(action2(payload));
            return Promise.resolve();
        }
    }
    

    It would then be possible to dispatch to the above with: actionCreator(payload).then(doAnotherAction(anotherPayload)) or the following, if we need to maintain order of calls: actionCreator(payload).then(() => doAnotherAction(anotherPayload))

    If you wish to 'future-proof' your action creator, so that it could handle calling both async and sync action creators, you could write it as:

    function actionCreator(payload) {
        return dispatch =>
            Promise.resolve(dispatch(action1(payload))).then(
            () => dispatch(action2(payload)));
    }
    

    And, if you like ES6 arrow notation the above can be defined as:

    const actionCreator = payload => dispatch =>
            Promise.resolve(dispatch(action1(payload))).then(
            () => dispatch(action2(payload)));
    
    0 讨论(0)
  • 2021-01-31 09:00

    The recommended way as per the documentation is in the action creator, like so:

    function actionCreator(payload) {
        return dispatch => {
            dispatch(action1(payload))
            dispatch(action2(payload))
        }
    }
    

    Then you would probably want to attach the action creators as prop and pass it down to the container using mapDispatchToProps like in the example mentioned here. So it would look something like so:

    const mapDispatchToProps = dispatch => ({
       action1: some_payload => dispatch(action1(some_payload))
       action2: some_payload => dispatch(action2(some_payload))
    })
    
    // your component
    export default connect(mapStateToProps, mapDispatchToProps)(YourApp)
    

    0 讨论(0)
  • 2021-01-31 09:01

    If you have a Promise Middleware, you can use this syntax so you're able to use .then() on your dispatch(topLevelAction()):

    export const topLevelAction = () => dispatch => {
        return Promise.all([dispatch(action1()), dispatch(action2()), dispatch(action3())])
    }
    
    0 讨论(0)
提交回复
热议问题