我正在尝试Authentication
为我的支票写支票DashBoard
。但是该函数本身并未被调用。有人可以给我一些解决方案吗?我正在用ReactJs开发。
这是路线部分:
<Router>
<div>
<Route exact path={"/"} component={Home} />
<Route path={"/SignUp"} component={SignUp} />
<Route path={"/SignIn"} component={SignIn} />
<Route path={"/Dashboard"} component={Dashboard} onEnter={this.requireAuth} />
</div>
</Router>
这是功能:
requireAuth (nextState, replace) {
console.log("?????????????",this.state.getToken);
if(!this.state.getToken) {
replace({pathname: '/'});
}
}
在react-router v4
,你可以利用render prop
来Route
与生命周期方法一起更换onEnter
功能存在于反应路由器V3。
查看此答案以获取更多详细信息:
react-router v4中的onEnter
prop
但是,由于您要做的只是在onEnter道具中进行身份验证,因此您可以轻松创建一个执行此操作的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)}/>
编辑:如果您需要进行网络呼叫以查找是否经过身份验证的使用,则可以将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>
}
}
问题内容: 我已经在应用程序中将React Router升级到了版本4。但是现在我得到了错误 此路由有什么问题? 问题答案: IndexRoute和browserHistory在最新版本中不可用,并且Routes不接受带有v4的子级Routes,您可以在组件本身中指定Routes 然后在主要部分 同样在汽车组件中 您将拥有
问题内容: 我对React还是比较陌生,我正在尝试弄清楚如何使React路由器正常工作。我有一个超级简单的测试应用程序,看起来像这样: 当我运行该应用程序时,home组件加载没有任何麻烦,并且当我单击“ Click Me”链接时,URL更改为localhost / about,但是什么也没有发生。如果单击刷新,则会显示“无法获取/关于”。显然我在做错事,但我一直无法弄清楚是什么。我也在使用Webp
问题内容: 我目前正在使用React Router v4来嵌套路由。 最接近的示例是React-Router v4文档中的route配置 。 我想将我的应用分为2个不同的部分。 前端和管理区域。 我在想这样的事情: 前端的布局和样式与管理区域不同。因此,在首页中,回家的路线大约应该是子路线。 / home 应该呈现在Frontpage组件中, / admin / home 应该呈现在Backend
问题内容: 我有一个问题要阻止未经授权的用户访问仅授权的路由/组件-例如登录的用户仪表板 我有以下代码: 路由器: 我尝试记录日志以检查是否已输入条件,但是从渲染函数收到错误消息,提示它无法读取null属性。 有没有办法解决我的问题,并且有更好的方法来满足我的要求?只有授权用户才能严格访问特定组件 问题答案: 警告:以下答案使用React的旧上下文API。 如果您使用的是V16.3 +,则以下答案
我正在用React和Spring Boot构建一个完整的堆栈应用程序,但是遇到了一个问题,我在任何地方都没有找到答案。 我试图实现的行为如下: > 如果用户想要访问登录或注册页面,我想要重定向用户到主页,如果他们被认证。在redux中,我在应用程序首次加载时设置了一个标志。 我还想重定向用户到登录页面,如果他们没有经过身份验证,并试图访问主页。 第一个目标工作正常,因为有很多教程解释如何使用反应路
问题内容: 我有以下路由配置: GuaranteeLoggedInContainer为: 但是,历史的推动力:没有用。这里没有历史。 如果我使用这样的配置: 我遇到类似的问题: reactjs中最好的身份验证方法是什么? 问题答案: 从我对您的React Router设计的了解中,您似乎正在使用React Router版本4 在这种情况下,您可以在组件本身中指定路由,并利用withRouter进行