【发布时间】:2019-11-15 15:13:37
【问题描述】:
我有一些受保护的路由器,但我需要在页面刷新时保持状态。
import React from 'react'
import { Route, Redirect, Switch } from 'react-router-dom'
const auth = {
isAuthenticated: true // this would be an http call to get user data
}
const PrivateRoute = ({ component: Component, ...rest }) => (
<Route {...rest} render={(props) => (
auth.isAuthenticated === true
? <Component {...props} />
: <Redirect to="/login" />
)} />
)
const Main = () => {
return (
<Switch>
<Route path="/login" exact strict component={Login}/>
<Route path="/logout" exact strict component={Logout}/>
<PrivateRoute path="/profile" exact strict component={Profile}/>
</Switch>
)
}
export default Main
我应该在哪里拨打服务电话?在主应用程序中?在上下文中?
更新:我在 Main 中添加了一个检查,它调用发送我存储的令牌的 api。该调用可能返回 200 和数据或 401
const auth = {
isAuthenticated: Api.status() // this is just a fetch to /status endpoint
.then(
status => {
console.log(status);
return true;
},
error => {
console.log(error);
return false;
}
)
}
但是当我点击 /profile 时,它会立即将我重定向到登录(因为 isAuthenticated 是假的)
我的问题完全基于用户刷新页面(F5)其他场景工作正常的场景。对不起,如果我不够清楚,很高兴再次澄清任何事情!
【问题讨论】:
-
您可能希望使用
localStorage或IndexedDB在状态更改时存储状态,并在重新加载页面时从中恢复。 -
这可能会产生另一个问题。就像检查过期的令牌一样。我还需要进行服务调用以获取应该在应用程序的所有页面中持续存在的用户详细信息(姓名、电子邮件等)。
-
嗨@Jurrian 实际上这就是我之前提到的关于存储过期 jwt 的问题,可以通过调用传递该令牌来解决这个问题,如果调用失败则删除令牌。但这几乎是我的问题。我应该在哪里进行这个需要在每次页面刷新时执行的 http 调用
-
这对标题有点误导。如果您要在组件加载时通过 http 调用检索状态,那么您不需要存储它。因此,您的问题似乎更像是在询问是否 a.) 每次都进行调用是一种好习惯,或者 b) 有条件的替代方案和存储状态的方法。但是您的代码并未反映最初的尝试。你试过什么?
标签: reactjs