开始组件App
呈现Wellcome
组件,进一步呈现Login
组件。
这些是从Router
出发的路线:
<Route exact path={"/welcome"} component={App} />
<Route exact path={"/"} component={Dashboard} />
在Dashboard
组件中,我进行了以下检查:
componentWillMount() {
if (!sessionStorage.getItem('token_object')) {
this.props.history.push('/welcome');
}
}
render() {
return (
<div className="wrapper">
<Sidebar />
<div id="content">
<Navbar />
<Footer />
</div>
</div>
);
}
当我在地址栏中点击http://localhost:myPort/
时,它应该尝试呈现仪表板组件并失败,因为“ if (!sessionStorage.getItem('token_object')) {
”假定用户未登录。但是失败了,它只是设置了URL在浏览器中浏览到http://localhost:myPort/welcome
,但继续呈现Dashboard
组件并失败。怎么了?
答案 0 :(得分:2)
还有其他一些方法可以进行这些检查,例如“高阶组件”或其他技巧。但是让我们关注上面的示例并将其重构为
render() {
const isLogged = !!sessionStorage.getItem('token_object'));
if (!isLogged) {
return (
<Redirect to="/welcome" />
)
}
return (
<div className="wrapper">
<Sidebar />
<div id="content">
<Navbar />
<Footer />
</div>
</div>
);
}
注释:
!!
用于获取是否设置了令牌的布尔值Redirect
组件答案 1 :(得分:0)
这里您只需在此处更新浏览器的地址栏,而无需使用React-router的逻辑以所需的方式呈现组件。
您可以使用react-router的<Redirect />
组件来实现您的目标。
这里是一个可能的解决方案,假设Dashboard
组件安装在Router
组件内部:
render() {
if (!sessionStorage.getItem('token_object')) {
return <Redirect to={'/welcome'} />;
}
return (
<div className="wrapper">
<Sidebar />
<div id="content">
<Navbar />
<Footer />
</div>
</div>
);
}
答案 2 :(得分:0)
始终尝试记录sessionStorage的值,甚至是window.sessionStorage。
请记住,通常sessionStorage将在componentDidMount上可用。
阅读this answer,以更好地阐明sessionStorage的工作原理。
请记住,sessionStorage在服务器端渲染中不可用。
答案 3 :(得分:0)
您必须使用条件渲染。
请参见reactjs.org的示例:
function Greeting(props) {
const isLoggedIn = props.isLoggedIn;
if (isLoggedIn) {
return <UserGreeting />;
}
return <GuestGreeting />;
}
ReactDOM.render(
// Try changing to isLoggedIn={true}:
<Greeting isLoggedIn={false} />,
document.getElementById('root')
);