【发布时间】:2021-12-08 04:12:42
【问题描述】:
我有一个 React/Node 应用程序,它让用户登录并被重定向到他的仪表板。我想要实现的是防止用户在未登录的情况下转到其他页面。我的 App.js 看起来像这样:
function App() {
const userInfo = localStorage.getItem("userInfo");
let resultat = JSON.parse(userInfo);
if(resultat!==null){
if(resultat.status==="ok"){
return (
<>
<Router basename={process.env.PUBLIC_URL}>
<Switch>
<Route path='/' exact component={ Dashboard }>
</Route>
<Route path='/login' exact component={ Login }>
</Route>
<Route path='/dashboard' exact component={ Dashboard }>
</Route>
<Route path='/other_route' exact component={ OtherComponent }>
</Route>
</Switch>
</Router>
</>
);
} else {
return(
<>
<Router basename={process.env.PUBLIC_URL}>
<Switch>
<Route path='/' exact component={ Login }>
</Route>
<Route path='/login' exact component={ Login }>
</Route>
<Route path='/*' exact>
<>
You are not logged in. To see this page please, log in.
</>
</Route>
</Switch>
</Router>
</>
);
}
} else {
return(
<>
<Router basename={process.env.PUBLIC_URL}>
<Switch>
<Route path='/' exact component={ Login }>
</Route>
<Route path='/login' exact component={ Login }>
</Route>
<Route path='/*' exact>
<>
You are not logged in. To see this page please, log in.
</>
</Route>
</Switch>
</Router>
</>
);
}
}
如果登录过程成功,我的 Login.js 组件会将用户重定向到路径 /dashboard。
问题是它仍然加载说要登录的页面。如果我重新加载页面,它会显示实际的仪表板。
我之所以发生是因为(我猜)React 只是在路由之间切换,从 /login 到 /* (/dashboard) 但它不会重新运行 App() 函数,因此它不能重做 @987654329 @测试。
我想如果我在进入仪表板时试图强制 React 重新加载页面(我试过 this answer)但它不起作用。
有什么方法可以实现我想做的吗?
提前致谢。
【问题讨论】:
-
如果使用类组件,则需要通过 useState 或 state 将变量更改为状态。 React 只会重新渲染真正改变的组件。如果变量发生变化并且您想要重新渲染引用那些您需要状态的组件。
-
@FeedThePiano 谢谢。不过,你能告诉我一个好方法吗?我创建了一个存储
resultat的状态,但我不知道如何在路由切换时更新该状态。 -
抱歉,回答迟了。在您的情况下,您使用的是功能组件,因此需要按如下方式定义和更新状态:
const [userInfo, setUserInfo] = useState({someData});使用 userInfo 访问数据,使用 setUserInfo 更新数据。使用 setUserInfo 方法更新它很重要。否则,不会触发重新渲染,否则更改状态是不干净的。你可以在这里阅读更多内容:reactjs.org/docs/hooks-state.html希望这会有所帮助 -
感谢您的帮助,问题是即使我将
userInfo置于一个状态,我的<Login>也没有更新它,所以我考虑使用react-redux并且它有效!