在
react-router v4
中,您可以利用
render prop
与生命周期方法一起使用
Route
,以替换存在于react-router v3中的
onEnter
功能。请参见此答案以获取更多详细信息:
onEnter prop in react-router v4
然而,如果您只想在onEnter prop中进行身份验证,那么可以轻松创建一个HOC来完成这个任务。
const RequireAuth = (Component) => {
return class App extends Component {
componentWillMount() {
const getToken = localStorage.getItem('token');
if(!getToken) {
this.props.history.replace({pathname: '/'});
}
}
render() {
return <Component {...this.props} />
}
}
}
export { RequireAuth }
并像这样使用它
<Route path={"/Dashboard"} component={RequireAuth(Dashboard)}/>
编辑:如果您需要进行网络调用以查找用户是否已验证,那么您可以编写如下的高阶组件:
Edit: 在情况下需要进行网络调用以查找用户是否已验证,您将编写类似于以下方式的 HOC
const RequireAuth = (Component) => {
return class App extends Component {
state = {
isAuthenticated: false,
isLoading: true
}
componentDidMount() {
AuthCall().then(() => {
this.setState({isAuthenticated: true, isLoading: false});
}).catch(() => {
this.setState({isLoading: false});
})
}
render() {
const { isAuthenticated, isLoading } = this.state;
if(isLoading) {
return <div>Loading...</div>
}
if(!isAuthenticated) {
return <Redirect to="/login" />
}
return <Component {...this.props} />
}
}
}
export { RequireAuth }
更新:
除了 HOC 之外,您还可以选择像 PrivateRoute
组件那样进行操作。
const PrivateRoute = ({component: Component, isAuthenticated, isLoading, ...rest }) => {
if(isLoading) {
return <div>Loading...</div>
}
if(!isAuthenticated) {
return <Redirect to="/login" />
}
return <Component {...this.props} />
}
}
}
export { PrivateRoute };
你可以像这样使用它
class App extends Component {
state = {
isAuthenticated: false,
isLoading: true
}
componentDidMount() {
AuthCall().then(() => {
this.setState({isAuthenticated: true, isLoading: false});
}).catch(() => {
this.setState({isLoading: false});
})
}
render() {
<Router>
<div>
<Route exact path={"/"} component={Home} />
<Route path={"/SignUp"} component={SignUp} />
<Route path={"/SignIn"} component={SignIn} />
<PrivateRoute path={"/Dashboard"} component={Dashboard} isAuthenticated={this.state.isAuthenticated} isLoading={this.isLoading}/>
</div>
</Router>
}
}
{requireAuth(); return }} />
但是我收到了以下错误提示:bundle.js:6004 警告:您不应在同一路由中使用和;将被忽略。
- Riya Kapuriathis.requireAuth()
,会怎么样? - Shubham Khatri