Reactjs React路由器4.x-连接到Redux后PrivateRoute不工作
连接Redux后,示例中可用的PrivateRoute不起作用 我的PrivateRoute看起来与原始版本几乎相同,但仅连接到Redux,并在原始示例中使用它而不是fakeAuthReactjs 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
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);
用法和结果:-
这是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()函数,该函数对我很有用