React和Redux:行动后重定向

ver*_*otr 17 react-router redux

我使用React/Redux开发了一个网站,我使用thunk中间件来调用我的API.我的问题涉及行动后的重定向.

我真的不知道如何以及在哪里可以进行重定向:在我的操作中,在reducer中,在我的组件中,......?

我的动作如下:

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

react-redux 已经在我的网站上实现,我知道我可以如下所示,但如果请求失败,我不想重定向使用:

router.push('/items');
Run Code Online (Sandbox Code Playgroud)

谢谢!

Yo *_*ita 16

绝对不要从你的减速器重定向,因为它们应该是副作用免费的.看起来你正在使用api-redux-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
  }
};
Run Code Online (Sandbox Code Playgroud)

我个人更喜欢在我的连接组件的道具中有一个标志,如果为真,将路由到我想要的页面.我会像这样设置componentWillReceiveProps:

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

  • 然后如何重置这个标志`isDeleted`?如果有人回到这个组件,那么他很有可能在没有做任何事情的情况下自动重定向. (6认同)
  • @Tomasz我有同样的担忧.如果新组件必须重置此重定向过程中使用的所有状态变量,这不会变得很麻烦.看起来很笨拙. (4认同)

Muh*_*man 8

最简单的解决方案

您可以使用 react-router-dom 版本 * 5+它实际上是建立在react-router核心之上的。

用法:

您需要从 react-router-dom导入useHistory钩子并直接将其传递到您的动作创建者函数调用中。

导入和创建对象

import { useHistory } from "react-router-dom";

const history = useHistory();
Run Code Online (Sandbox Code Playgroud)

组件中的动作调用:

dispatch(actionName(data, history));
Run Code Online (Sandbox Code Playgroud)

Action Creator 现在,您可以在 action creator 中访问 history 对象作为函数参数。

function actionName(data, history) {}
Run Code Online (Sandbox Code Playgroud)


Pra*_*rma 7

通常,更好的做法是在组件中重定向,如下所示:

render(){
   if(requestFullfilled){
       router.push('/item')
   }
   else{
       return(
          <MyComponent />
       )
   }
}
Run Code Online (Sandbox Code Playgroud)

  • 但这里的 requestFullfilled 是什么?是否只能通过在 redux 中设置新状态来获取有关已完成请求的信息,或者还有其他聪明的方法吗? (3认同)
  • 有一个错字,叫已完成 (2认同)