如果 logged_in 在上下文中为假,如何重定向,否则让我们继续页面
how to redirect if logged_in is false in context else let proceed to page
我正在开发一个简单的 ReactJS 应用程序。我想向我的页面添加身份验证,所以我选择了上下文来满足我更简单的要求。我有一个默认情况下为 false 的上下文变量,当有人输入正确的用户名密码时,我将其设置为 true。这一直有效。但是我的页面仍然可以公开访问,所以我发现我需要使用 HOC 添加重定向逻辑。但是我无法理解如何为此任务实施 HOC。
Context.js
import React from 'react';
export const AppContext = React.createContext(false);
Login.js
//other imports here
import { AppContext } from '../context';
export function LoginPage() {
//component local state to track username password etc here
let { loggedIn, toggleLoggedIn } = useContext(AppContext);
const handleSubmit = (event) => {
//some irrelevant stuff here
fetch("/accounts/login", {
method: 'POST',
body: JSON.stringify({
'username': user,
'password': password
})})
.then((response) => {
if(response.ok) {
toggleLoggedIn(true);
}
else {
//some irrelevant stuff here
}....
App.js
//other components imports here
import { AppContext } from './context';
function App() {
const [loggedIn, toggleLoggedIn] = useState(false);
return (
<div className="app">
<Header className="app-header"/>
<div className="links">
<NavLink activeClassName="selected" exact className="link" to="/">Home page</NavLink>
<NavLink activeClassName="selected" exact className="link" to="/open_alerts/">Open Alerts</NavLink>
<NavLink activeClassName="selected" exact className="link" to="/backend_ops/">Backend operations</NavLink>
</div>
<AppContext.Provider value={{ loggedIn, toggleLoggedIn}}>
<Switch>
<Route exact path="/login/">
<div>
<LoginPage />
</div>
</Route>
<Route exact path="/">
<div className="charts new-line-block">
<div className="split left">
<AlertsChart />
</div>
<div className="split right">
<RegionCharts />
</div>
</div>
<br></br>
<br></br>
</Route>
<Route path="/open_alerts/">
<div className="alerts-table new-line-block">
<br></br>
<AlertsTable />
</div>
</Route>
...so on
您可以 return 基于登录状态的路由:
protectedRoute() {
return (
<Switch>
<Route path="/login" component={LoginPage} />
<Route exact path="/">
<div className="charts new-line-block">
<div className="split left">
<AlertsChart />
</div>
<div className="split right">
<RegionCharts />
</div>
</div>
<br></br>
<br></br>
</Route>
.... ....
<Redirect to="/" />
</Switch>
);
}
然后终于
{loggedIn ? (
protectedRoute()
) : (
<Switch>
<Route path="/login" component={Login} />
<Redirect to="/login" />
</Switch>
)}
我正在开发一个简单的 ReactJS 应用程序。我想向我的页面添加身份验证,所以我选择了上下文来满足我更简单的要求。我有一个默认情况下为 false 的上下文变量,当有人输入正确的用户名密码时,我将其设置为 true。这一直有效。但是我的页面仍然可以公开访问,所以我发现我需要使用 HOC 添加重定向逻辑。但是我无法理解如何为此任务实施 HOC。
Context.js
import React from 'react';
export const AppContext = React.createContext(false);
Login.js
//other imports here
import { AppContext } from '../context';
export function LoginPage() {
//component local state to track username password etc here
let { loggedIn, toggleLoggedIn } = useContext(AppContext);
const handleSubmit = (event) => {
//some irrelevant stuff here
fetch("/accounts/login", {
method: 'POST',
body: JSON.stringify({
'username': user,
'password': password
})})
.then((response) => {
if(response.ok) {
toggleLoggedIn(true);
}
else {
//some irrelevant stuff here
}....
App.js
//other components imports here
import { AppContext } from './context';
function App() {
const [loggedIn, toggleLoggedIn] = useState(false);
return (
<div className="app">
<Header className="app-header"/>
<div className="links">
<NavLink activeClassName="selected" exact className="link" to="/">Home page</NavLink>
<NavLink activeClassName="selected" exact className="link" to="/open_alerts/">Open Alerts</NavLink>
<NavLink activeClassName="selected" exact className="link" to="/backend_ops/">Backend operations</NavLink>
</div>
<AppContext.Provider value={{ loggedIn, toggleLoggedIn}}>
<Switch>
<Route exact path="/login/">
<div>
<LoginPage />
</div>
</Route>
<Route exact path="/">
<div className="charts new-line-block">
<div className="split left">
<AlertsChart />
</div>
<div className="split right">
<RegionCharts />
</div>
</div>
<br></br>
<br></br>
</Route>
<Route path="/open_alerts/">
<div className="alerts-table new-line-block">
<br></br>
<AlertsTable />
</div>
</Route>
...so on
您可以 return 基于登录状态的路由:
protectedRoute() {
return (
<Switch>
<Route path="/login" component={LoginPage} />
<Route exact path="/">
<div className="charts new-line-block">
<div className="split left">
<AlertsChart />
</div>
<div className="split right">
<RegionCharts />
</div>
</div>
<br></br>
<br></br>
</Route>
.... ....
<Redirect to="/" />
</Switch>
);
}
然后终于
{loggedIn ? (
protectedRoute()
) : (
<Switch>
<Route path="/login" component={Login} />
<Redirect to="/login" />
</Switch>
)}