React and Redux: redirect after action

后端 未结 6 1356
孤城傲影
孤城傲影 2020-12-30 01:43

I develop a website with React/Redux and I use a thunk middleware to call my API. My problem concerns redirections after actions.

I really do not know how and where

相关标签:
6条回答
  • 2020-12-30 01:52

    In the Redux scope must be used react-redux-router push action, instead of browserHistory.push

    import { push } from 'react-router-redux'
    
    store.dispatch(push('/your-route'))
    
    0 讨论(0)
  • 2020-12-30 02:00

    Another way is to create a redirect function that takes in your redirect Url:

    const redirect = redirectUrl => {
      window.location = redirectUrl;
    };
    

    Then import it into your action after dispatch and return it;

    return redirect('/the-url-you-want-to-redirect-to');
    
    0 讨论(0)
  • 2020-12-30 02:01

    Usually the better practice is to redirect in the component like this:

    render(){
       if(requestFullfilled){
           router.push('/item')
       }
       else{
           return(
              <MyComponent />
           )
       }
    }
    
    0 讨论(0)
  • 2020-12-30 02:06

    Definitely do not redirect from your reducers since they should be side effect free. It looks like you're using api-redux-middleware, which I believe does not have a success/failure/completion callback, which I think would be a pretty useful feature for the library.

    In this question from the middleware's repo, the repo owner suggests something like this:

    // Assuming you are using react-router version < 4.0
    import { browserHistory } from 'react-router';
    
    export function deleteItem(id) {
      return {
        [CALL_API]: {
          endpoint: `item/${id}`,
          method: 'DELETE',
          types: [
            DELETE_ITEM_REQUEST, 
            {
              type: DELETE_ITEM_SUCCESS,
              payload: (action, state, res) => {
                return res.json().then(json => {
                  browserHistory.push('/your-route');
                  return json;
                });
              },
            },
            DELETE_ITEM_FAILURE
          ]
        },
        id
      }
    };
    

    I personally prefer to have a flag in my connected component's props that if true, would route to the page that I want. I would set up the componentWillReceiveProps like so:

    componentWillReceiveProps(nextProps) {
      if (nextProps.foo.isDeleted) {
        this.props.router.push('/your-route');
      }
    }
    
    0 讨论(0)
  • 2020-12-30 02:13

    I would love not to redirect but just change the state. You may just omit the result of deleted item id:

    // dispatch an action after item is deleted
    dispatch({ type: ITEM_DELETED, payload: id })
    
    // reducer
    case ITEM_DELETED:
      return { items: state.items.filter((_, i) => i !== action.payload) }
    
    0 讨论(0)
  • 2020-12-30 02:15

    The simplest solution

    You can use react-router-dom version *5+ it is actually built on top of react-router core.

    Usage:

    You need to import useHistory hook from react-router-dom and directly pass it in your actions creator function call.

    Import and Creating object

    import { useHistory } from "react-router-dom";
    
    const history = useHistory();
    

    Action Call in Component:

    dispatch(actionName(data, history));
    

    Action Creator Now, you can access history object as a function argument in action creator.

    function actionName(data, history) {}
    
    0 讨论(0)
提交回复
热议问题