connect 和 withRouter 问题

Posted

技术标签:

【中文标题】connect 和 withRouter 问题【英文标题】:connect and withRouter issue 【发布时间】:2019-06-12 07:28:46 【问题描述】:

我在我的项目中使用 Redux 和 React。我在 App.js 中有一些路由。我还在我的项目中使用 react-redux 中的连接功能。为了防止更新阻塞问题,我通常以这种方式包装我的组件

withRouter(connect(mapStateToProps, mapDispatchToProps)(App)),

但是,如果我更改了 withRouter 的顺序并连接它不起作用:

connect(mapStateToProps, mapDispatchToProps)(withRouter(App))

我有 console.log App.js 中的道具。它已经接收到位置和历史道具。我正在弄清楚为什么顺序很重要背后的理论?

【问题讨论】:

【参考方案1】:

您可以将它与 redux 库中的 compose 方法一起使用。

export default compose(
  withRouter,
  connect(mapStateToProps, mapDispatchToProps)
)(App);

【讨论】:

在这种情况下,mapStateToProps、mapDispatchToProps 的值是多少?在 App 层面,我们应该如何定义这两个?这两个不是特定于每个组件(从 redux 中获取该组件感兴趣的那些 props)吗? import compose from "redux"; //Code export default compose( withRouter, connect(mapStateToProps, mapDispatchToProps) )(App); 我做到了,但现在我得到了JSX element type 'App' does not have any construct or call signatures. TS2604【参考方案2】:

你能不能参考一下这个https://reacttraining.com/react-router/core/api/withRouter,上面明明说反过来不行

【讨论】:

它在哪里说的?您能否在答案中引用相关部分? 哦,嗨,我以为文档本身中提到了它,但现在看似乎没有,也许我弄错了 也许它确实在某个时候提到过它,但它可能从那以后改变了!【参考方案3】:

你可以通过两种方式做到这一点,

正确方法:

withRouter(connect(mapStateToProps, mapDispatchToAction)(App));

这样,您将能够在 mapStateToProps 中获取 withRouter 道具,例如历史记录、匹配等。

第二种方式:

connect(mapStateToProps, mapDispatchToAction)(withRouter(App));

使用这个,你将无法获得 withRouter 道具

【讨论】:

这是完美的工作。在我的反应应用程序 v17.... react-router-dom 5 和 redux 最新。【参考方案4】:

如果有人仍然有问题,请关注这个

const ShowTheLocationWithRouter = withRouter(Login);

export default connect(mapStateToProps, mapDispatchToProps)(ShowTheLocationWithRouter);

【讨论】:

这不起作用,因为我遇到了一个错误,该错误引发了登录页面(或您将包装的组件)中的 SetState 函数将处于错误状态,

以上是关于connect 和 withRouter 问题的主要内容,如果未能解决你的问题,请参考以下文章

输入一个同时使用 withRouter 和 connect 的 HOC 组件

为啥 withRouter 与 connect() 一起使用会破坏我的反应应用程序?

如何将 TypeScript 与 withRouter、connect、React.Component 和自定义属性一起使用?

浅谈connect,withRouter,history,useState,useEffect

[Redux] Using withRouter() to Inject the Params into Connected Components

带连接的 withRouter 在 v5.0.0 中不起作用?