动作redux后反应路由器重定向

xim*_*met 49 reactjs react-router redux-framework redux

我正在使用react-redux和标准的react-routing.我需要在明确的行动后重定向.

例如:我已经注册了几个步骤.行动结束后:

function registerStep1Success(object) {
    return {
        type: REGISTER_STEP1_SUCCESS,
        status: object.status
   };
}
Run Code Online (Sandbox Code Playgroud)

我希望他使用registrationStep2重定向到页面.怎么做?

ps在历史浏览器中,'/ registrationStep2'从未出现过.此页面仅在成功结果registrationStep1页面后出现.

Dan*_*mov 56

使用React Router 2+,无论您何时发送操作,都可以调用browserHistory.push()(或者hashHistory.push()如果您使用的话):

import { browserHistory } from 'react-router'

// ...
this.props.dispatch(registerStep1Success())
browserHistory.push('/registrationStep2')
Run Code Online (Sandbox Code Playgroud)

如果您使用的话,也可以从异步操作创建器执行此操作.

  • 对于React Router 4+,这仍然适用吗?或者现在有更好的方法吗? (8认同)
  • 注意:browserHistory不再有效. (7认同)
  • 如果您想让Redux DevTools重播路由转换,您需要在https://github.com/acdlite/redux-router和https://github.com/reactjs/react-router-redux之间进行选择.在这种情况下,我会建议https://github.com/reactjs/react-router-redux,因为它更稳定,更简单. (5认同)
  • 此解决方案仍然可用吗?我似乎无法正常工作...使用`browserHistory.push()`后,URL更新,但视图未更新。 (2认同)

小智 23

你有没有检查过react-router-redux?该库可以将react-router与redux同步.

以下是有关如何使用react-router-redux的推送操作实现重定向的文档中的示例.

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'))
Run Code Online (Sandbox Code Playgroud)

  • 以及在Action之后如何重定向另一个页面(使用react-router-redux). (18认同)
  • 现在已弃用react-router-redux。请改为查看https://github.com/supasate/connected-react-router (3认同)

Jac*_*bec 7

路由器版本 4+ 的最简单解决方案:我们使用 "react-router-dom": "4.3.1" 它不适用于版本 5+

从初始化的位置导出浏览器历史记录并使用 browserHistory.push('/pathToRedirect'):

必须安装包历史记录(例如:“history”:“4.7.2”):

npm install --save history
Run Code Online (Sandbox Code Playgroud)

在我的项目中,我在 index.js 中初始化浏览器历史记录:

import { createBrowserHistory } from 'history';

export const browserHistory = createBrowserHistory();
Run Code Online (Sandbox Code Playgroud)

在动作中重定向:

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
                    }
                );
            });
};
Run Code Online (Sandbox Code Playgroud)


Mat*_*het 5

为了构建 Eni Arinde 之前的答案(我没有评论的声誉),以下是如何store.dispatch在异步操作之后使用该方法:

export function myAction(data) {
    return (dispatch) => {
        dispatch({
            type: ACTION_TYPE,
            data,
        }).then((response) => {
            dispatch(push('/my_url'));
        });
    };
}
Run Code Online (Sandbox Code Playgroud)

诀窍是在操作文件中而不是在减速器中执行此操作,因为减速器不应该有副作用。

  • 如何链接调度呼叫?调度()。然后(()=>调度)?这似乎不起作用。'那么不是一个函数' (2认同)