【发布时间】:2021-01-31 00:31:27
【问题描述】:
当我点击侧边菜单中的注销时,
它应该返回到 /login,但仍保持在同一路径 /home 中,内容消失。
App.js 中几个状态的解释
import React, { Component } from "react";
import { BrowserRouter, Switch, Route } from "react-router-dom";
import { Redirect } from "react-router";
import Login from "./Login";
import Drawer from "./Drawer";
console.warn = console.error = () => {};
class App extends Component {
state = {
isAuthenticated: false,
isAuthenticating: true,
user: null
};
setAuthStatus = (authenticated) => {
this.setState({ isAuthenticated: authenticated });
};
setUser = (user) => {
this.setState({ user: user });
};
handleLogout = async () => {
try {
//Sign Out api runs here
this.setAuthStatus(false);
this.setUser(null);
} catch (error) {
console.log(error);
}
};
async componentDidMount() {
try {
// run api change to auth setAuthStatus
// if api no return error > continue
this.setAuthStatus(true);
let user = { id: 123 };
this.setUser(user);
} catch (error) {
console.log(error);
}
this.setState({ isAuthenticating: false });
}
render() {
const authProps = {
isAuthenticated: this.state.isAuthenticated,
user: this.state.user,
setAuthStatus: this.setAuthStatus,
setUser: this.setUser
};
return (
!this.state.isAuthenticating && (
<React.Fragment>
{this.state.isAuthenticated ? (
<Drawer
props={this.props}
auth={authProps}
handleLogout={this.handleLogout}
/>
) : (
<BrowserRouter>
<Switch>
<Redirect exact from="/" to="/Login" />
<Route
path="/login"
render={(props) => <Login {...props} auth={authProps} />}
/>
</Switch>
</BrowserRouter>
)}
</React.Fragment>
)
);
}
}
export default App;
isAuthenticating:
componentDidMount会调用api查看会话是否继续,
如果是,isAuthenticating 等于 true,可以防止在刷新页面或转到其他路由时丢失当前会话中的用户身份验证。
已通过身份验证:
如果 !isAuthenticated > 必须留在/重定向到登录页面
沙盒:
https://codesandbox.io/s/restless-breeze-p5uih?file=/src/App.js
【问题讨论】:
-
请在您的问题中添加相关代码
标签: reactjs react-router