React Router 4.x - PrivateRoute not working after connecting to Redux

断了今生、忘了曾经 提交于 2019-11-30 11:36:00

问题


PrivateRoute available in Example https://reacttraining.com/react-router/web/example/auth-workflow is not working after connecting with Redux.

My PrivateRoute look almost same to the original version but only connected to Redux and used it instead of fakeAuth in the original example.

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);

Usage and result:-

  1. NOT working but desired & expecting to work
    • <PrivateRoute path="/member" component={MemberPage} />
  2. working but NOT desired to used like this
    • <PrivateRoute path="/member" component={MemberPage} auth={auth} />
  3. working. JUST to work but NOT desired to used at all. An understanding from this point is that, if you connect original PrivateRoute to Redux you need to pass some additional props (any prop) to make PrivateRoute working otherwise it does not work. Anyone, please give some hint on this behavior. This is my main question
    • <PrivateRoute path="/member" component={MemberPage} anyprop={{a:1}} />

回答1:


Complementary to @Tharaka answer you can pass {pure: false} to connect method as described in react-redux troubleshooting section.

React-redux makes shallow comparison of props in shouldComponentUpdate hook to avoid unnecessary re-renders. If context props changed (react-router) it doesn’t check for that and it assumes nothing has changed.

{ pure:false } simply disables this shallow comparison.




回答2:


According to react-router documentation you may just wrap your connect function with withRouter:

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

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

This worked for me.




回答3:


This is known issue in react-redux and you can read more about this here. The problem is connect HoC have implemented shouldComponentUpdate, so that wrapped component doesn't rerender if props aren't changed. Since react-router use context to pass route changes, the wrapped component doesn't rerender when routes change. But it seems they are going to remove shouldComponentUpdate in 5.1 version of react-redux. Currently, as a workaround, I pass a prop coming from Router like this.props.match.params to connected child component even though I don't use it in inside. But it will make rerendering the component each time when routes change.



来源:https://stackoverflow.com/questions/43892050/react-router-4-x-privateroute-not-working-after-connecting-to-redux

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!