【发布时间】:2018-03-04 22:21:11
【问题描述】:
我在阻止未经授权的用户访问仅授权的路由/组件时遇到问题 - 例如登录的用户仪表板
我有以下代码:
import React from 'react'
//other imports
import {withRouter} from 'react-router'
class User extends React.Component {
constructor(props) {
super(props)
console.log('props', props)
let user = JSON.parse(localStorage.getItem('userDetails'))
if(!user || !user.user || props.match.params.steamId !== user.user.steamId) {
props.history.push('/')
} else {
this.props.updateUserState(user)
this.props.getUser(user.user.steamId)
}
}
//render function
}
//mapStateToProps and mapDispatchToProps
export default withRouter(connect(mapStateToProps, mapDispatchToProps)(User))
路由器:
render() {
return (
<Router>
<div>
<Route exact path="/" component={Main}/>
<Route path="/user/:steamId" component={User}/>
<Route path="/completelogin" component={CompleteLogin}/>
</div>
</Router>
)
}
我尝试记录以检查是否输入了条件,但我从渲染函数中得到一个错误,说它无法读取 null 的属性。
有没有办法解决我的问题以及更好的方法来满足我的要求?只有授权用户才能严格访问特定组件
【问题讨论】:
-
理想情况下,您应该将身份验证变量设置为 false,然后在 componentWillMount 或 componentDidMount 中检查条件,而不是在构造函数中,请参阅stackoverflow.com/questions/44434041/…
-
正如@Shubham Khatri 所说,您不应该在构造函数中放置任何逻辑,而是使用生命周期方法。另外,请注意,您在同一方法中同时使用了
props和this.props。 -
@ShubhamKhatri 谢谢,添加到 componentWillMount 时它起作用了。我对 React 和学习组件的生命周期仍然很陌生。
-
你能显示路由器的代码吗?配置实际路由的位置。通常它在 main/app/index 文件中。我怀疑问题出在那儿。
-
@MatthewBarbara 我已将路由器的代码添加到我的问题中。路由器是浏览器路由器。此外,当我在我的渲染方法中渲染常规 HTML 时,将我的逻辑添加到 componentWillMount 时,当我将自定义组件添加到 User 组件时它再次失败。
标签: javascript reactjs functional-programming react-router-v4 higher-order-components