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

Reactjs React路由器4.x-连接到Redux后PrivateRoute不工作,reactjs,redux,react-router-redux,react-router-v4,react-router-dom,Reactjs,Redux,React Router Redux,React Router V4,React Router Dom,连接Redux后,示例中可用的PrivateRoute不起作用 我的PrivateRoute看起来与原始版本几乎相同,但仅连接到Redux,并在原始示例中使用它而不是fakeAuth const PrivateRoute = ({ component: Component, auth, ...rest }) => ( <Route {...rest} render={props => auth.isAuthenticated ? <Compo

连接Redux后,示例中可用的PrivateRoute不起作用

我的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);
const privaterote=({component:component,auth,…rest})=>(
auth.isAuthenticated
? 
: }
/>
);
PrivateRoute.propTypes={
auth:PropTypes.object.isRequired,
组件:PropTypes.func.isRequired
}
const mapStateToProps=(state,ownProps)=>{
返回{
auth:state.auth
}
};
导出默认连接(MapStateTops)(PrivateRoute);
用法和结果:-

  • 不工作,但希望工作
  • 正在工作但不希望这样使用
  • 工作。只是为了工作,但根本不想使用。从这一点上可以理解,如果您将原始PrivateRoute连接到Redux,则需要传递一些额外的道具(任何道具)以使PrivateRoute工作,否则它将不工作任何人,请给出有关此行为的提示。这是我的主要问题

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

    补充@Tharaka answer,您可以将
    {pure:false}
    传递到
    连接
    方法,如中所述

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

    {pure:false}
    只是禁用这种肤浅的比较。

    根据您的要求,您可以将您的
    连接
    功能包装为
    带路由器

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

    这对我很有用。

    你能给我写一个PrivateRoute的工作使用示例吗?或者需要对PrivateRoute本身进行更改。我想不出任何方法可以让PrivateRoute在1使用中如你所期望的那样工作。我的建议是,在他们解决这个问题之前,如果对你有效,就使用用法3。或者您可以像这样将
    params
    传递给PrivateRoute<代码>
    另外一个解决方法是,我在更改historyupdate之后立即使用forceUpdate():我发现使用redux的父组件也必须连接到withRouter,因此没有必要使用forceUpdate(),谢谢我会尝试。我相信这最符合预期结果地回答了这个问题。为我工作请详细说明
    pure
    的含义以及使用它的缺点。基于链接的答案只有完整答案的一半;)明亮的这是最简单的解决办法。我还删除了shouldComponentUpdate()函数,该函数对我很有用