React и Redux: перенаправление после действия

Я разрабатываю веб-сайт с React/Redux, и я использую промежуточное ПО thunk для вызова моего API. Моя проблема касается перенаправления после действий.

Я действительно не знаю, как и где я могу сделать перенаправление: в моем действии, в редукторе, в моем компоненте, ... ?

мое действие выглядит так:

export function deleteItem(id) {
    return {
        [CALL_API]: {
            endpoint: `item/${id}`,
            method: 'DELETE',
            types: [DELETE_ITEM_REQUEST, DELETE_ITEM_SUCCESS, DELETE_ITEM_FAILURE]
        },
        id
    };
}

react-redux уже реализован на моем сайте, и я знаю, что могу сделать, как показано ниже, но я не хочу перенаправлять использование, если запрос не удалось:

router.push('/items');

спасибо!

3 ответов


обычно лучше перенаправить компонент следующим образом:

render(){
   if(requestFullfilled){
       router.push('/item')
   }
   else{
       return(
          <MyComponent />
       )
   }
}

наверняка не перенаправление от ваших редукторов, так как они должны быть без побочных эффектов. Похоже, вы используете api-redux-middleware, который, я считаю, не имеет обратного вызова успеха/сбоя/завершения, что, я думаю, было бы довольно полезной функцией для библиотеки.

в этом вопросе с middleware РЕПО, владелец РЕПО предлагает что-то вроде этого:

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

Я лично предпочитаю иметь флаг в моем подключении реквизит компонента, который, если true, будет маршрутизировать на страницу, которую я хочу. Я бы настроил componentWillReceiveProps следующим образом:

componentWillReceiveProps(nextProps) {
  if (nextProps.foo.isDeleted) {
    this.props.router.push('/your-route');
  }
}

в области Redux необходимо использовать react-redux-router push действий, вместо browserHistory.push

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

store.dispatch(push('/your-route'))