[英]React Router 4.x - PrivateRoute not working after connecting to Redux
與Redux連接后,示例https://reacttraining.com/react-router/web/example/auth-workflow中可用的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);
用法和結果:-
<PrivateRoute path="/member" component={MemberPage} />
<PrivateRoute path="/member" component={MemberPage} auth={auth} />
<PrivateRoute path="/member" component={MemberPage} anyprop={{a:1}} />
與@Tharaka答案互補的是,您可以通過{pure: false}
來connect
方法,如react-redux故障排除一節所述 。
React-redux在shouldComponentUpdate
掛鈎中對道具進行了淺層比較,以避免不必要的重新渲染。 如果上下文道具更改(反應路由器),則不會進行檢查,並且假定沒有任何更改。
{ pure:false }
僅禁用此淺表比較。
根據react-router文檔,您可以將connect
函數包裝在withRouter
:
// before
export default connect(mapStateToProps)(Something)
// after
import { withRouter } from 'react-router-dom'
export default withRouter(connect(mapStateToProps)(Something))
這對我有用。
這是react-redux中的已知問題,您可以在此處閱讀有關此內容的更多信息。 問題是connect
HoC已經實現了shouldComponentUpdate
,因此,如果不更改props
,包裝的組件不會shouldComponentUpdate
。 由於react-router使用上下文傳遞路由更改,因此在路由更改時不會重新包裝組件。 但是似乎他們打算在react-redux的5.1版本中刪除shouldComponentUpdate
。 目前,作為一種解決方法,我將諸如this.props.match.params
類的來自Router的prop傳遞給了連接的子組件,即使我沒有在內部使用它。 但是,每次更改路線時,都會重新渲染組件。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.