在 react-router-v4 中使用 history.push in action creator?

IT技术 reactjs redux react-router react-redux react-router-v4
2021-04-10 05:27:00

我发现在不使用完成react-router-redux路由的情况下解决此问题的唯一工作方法action creator async action是将historyprops从组件传递给动作创建者并执行以下操作:

history.push('routename');

由于BrowserRouter忽略了传递给它的 history 属性,因此我们不能使用带有 browserhistory 的自定义历史对象。

解决这个问题的最佳方法是什么?

1个回答

BrowserRouter您可以使用Router自定义历史记录,而不是使用

import { Router } from 'react-router'

import createBrowserHistory from 'history/createBrowserHistory'

export const history = createBrowserHistory()

<Router history={history}>
  <App/>
</Router>

在这种情况下,您history.push()将工作。使用 BrowserRouterhistory.push不起作用,因为创建新的browserHistory不起作用,因为<BrowserRouter>创建了自己的历史实例,并侦听了更改。因此,不同的实例将更改 url 但不会更新<BrowserRouter>.

创建自定义后history,您可以将其导出,然后将其导入您的action creator并使用它来动态导航,例如

import { history } from '/path/to/index';

const someAction = () => {
    return dispatch => {
        ApiCall().then((res) => {
            dispatch({type: 'SOME_CALL', payload: res })
            history.push('/home');
        })
    }
}
使用此解决方案,将历史对象导入操作创建者时出现错误 TypeError: "_routing__WEBPACK_IMPORTED_MODULE_3__.default.push is not a function"
2021-05-22 05:27:00
@ann.piv 你能不能创建一篇关于它的使用和创建的更多细节的帖子
2021-05-25 05:27:00
history还包含location( history.location.pathname),对于基于当前 url 进行重定向非常有用。
2021-06-12 05:27:00
是的,它是默认导出。History 对象已导入到操作文件中,但在调用 history.push 时出现错误
2021-06-13 05:27:00
@ann.piv 您确定您已将历史导出为默认值吗
2021-06-15 05:27:00