当前位置: 首页 > 知识库问答 >
问题:

React路由器4.x-连接到Redux后PrivateRoute不工作

端木令雪
2023-03-14

示例中提供了PrivateRoutehttps://reacttraining.com/react-router/web/example/auth-workflow 与Redux连接后不工作。

我的PrivateRoute看起来与原始版本几乎相同,但只连接到Redux,并在原始示例中使用它而不是fakeAuth。

const PrivateRoute = ({ component: Component, auth, ...rest }) => (
  <Route
   {...rest}
   render={props =>
   auth.isAuthenticated
    ? <Component {...props} />
    : <Redirect to={{ pathname: "/login" }} />}
  />
);

 PrivateRoute.propTypes = {
  auth: PropTypes.object.isRequired,
  component: PropTypes.func.isRequired
 }

 const mapStateToProps = (state, ownProps) => {
  return {
     auth: state.auth
  }
};

export default connect(mapStateToProps)(PrivateRoute);

用法和结果:-

  • 不起作用,但需要

共有3个答案

厉熠彤
2023-03-14

这是react redux中的一个已知问题,您可以在这里阅读更多有关这方面的内容。问题是,connectHoC已经实现了shouldComponentUpdate,这样如果道具没有更改,包装的组件就不会重新加载。由于react router使用上下文传递路由更改,所以当路由更改时,包装的组件不会重新加载。但他们似乎要删除react redux 5.1版本中的shouldComponentUpdate。目前,作为一种解决方法,我将一个来自路由器的道具(如this.props.match.params)传递给连接的子组件,即使我在内部不使用它。但它会使组件在每次路由更改时重新招标。

暴骏奇
2023-03-14

根据react路由器文档,您可以将您的connect功能包装为withRouter

// before
export default connect(mapStateToProps)(Something)

// after
import { withRouter } from 'react-router-dom'
export default withRouter(connect(mapStateToProps)(Something))

这对我有用。

傅阿苏
2023-03-14

作为@Tharaka答案的补充,您可以将{pure:false}传递到连接方法,如react-redux疑难解答部分所述。

React redux在shouldComponentUpdatehook中对道具进行了粗略的比较,以避免不必要的重新渲染。如果上下文道具发生了变化(react router),它不会对此进行检查,并假定没有任何变化。

{pure:false}只会禁用此浅比较。

 类似资料:
  • 重新加载后,私人路由重定向到授权开始之前的 /login,因为初始redux状态对它们两者都是假的。 这些是路由器的日志: PrivateRoute.js:16加载:false isAuthenticated:false PrivateRoute.js:16加载:true isAuthenticated:false PrivateRoute.js:16加载:false isAuthenticate

  • 我的react redux专用路由器不工作。它只是向我展示了我试图访问的路线的空白页。我的州没有在Redux开发工具上加载。这也可能是HashRouter的问题吗?My PrivateRoute组件: 我的应用程序,我正在包装我的路线,使其成为私人:

  • 我在使用React路由器进行登录后重定向时遇到问题。 假设用户试图导航到但被重定向到因为他们的会话已过期。endpoint存在于PrivateRoute中。 登录后,我希望用户被引导到,但相反,他们目前只重定向到。 成功登录后,如何利用原始目的地进行重定向? 谢谢你的时间!

  • 使用redux和反应路由器,我想访问路由指定的组件以外的组件上的路由参数。 我已经对react-router、redux和react-router-redux进行了如下设置,我想从我的redux存储访问reportId参数。 我已经尝试连接react-redux路由器来存储路由状态,但是我发现除了活动路由的完整路径之外,redux内部没有任何有用的存储。这让我可以选择从redux中的路径解析出re

  • 以下是react router的一个示例,介绍如何为受保护的路由添加组件: https://reacttraining.com/react-router/web/example/auth-workflow 我已经尝试在我的Typescript项目中实现这个功能,使用上面的例子作为灵感。 组件/路线 连接器/专用线路 组件/专用路由 错误

  • 我有一个简单的(目前)应用程序,使用react router和redux,我想为它添加国际化功能。 我已经安装了npm包,并且能够安装和运行提供的示例。我已经将适当的导入添加到我自己的应用程序中,并将国际化标签添加到根渲染方法中。 当我将I18nextProvider标记添加到render方法时,我得到了错误 找不到模块“react” 这并不是特别有用,尤其是因为如果我删除标签,react应用程序