javascript - React js重定向功能
问题描述
我正在为我的 React js 项目使用 firebase auth。目标- 当用户进入路径 - '/home' 时,它应该检查用户是否登录。如果未登录,则重定向到路径 - '/' ,否则呈现组件“Home”。但是,当我运行代码时,功能正常工作,但组件未在屏幕上呈现。
App.js 的代码 -
function App() {
var users;
function checkUserLoggedIn() {
firebase.auth().onAuthStateChanged(function (user) {
users = user;
console.log(users);
users ? <Home /> : <Redirect to="/" />;
});
}
return (
<div className="app">
<Router>
<Switch>
<Route exact path="/">
<Welcome />
</Route>
<Route path="/home">{checkUserLoggedIn()}</Route>
</Switch>
</Router>
</div>
);
}
知道为什么这不起作用吗?谢谢 !
解决方案
创建一个Dictionary文件路由并添加三个文件
- index.js
- publicRoute.js
- 私有路由.js
在 index.js 中
/// index.js
import React, { useEffect } from 'react';
import { useLocation } from 'react-router-dom';
import PrivateRoutes from './PrivateRoutes'
import PublicRoutes from './PublicRoutes';
function Routes() {
const { pathname } = useLocation();
const[isUserLoggedIn, setLoggedIn] = React.useState(false)
useEffect(() => {
firebase.auth().onAuthStateChanged(function (user) {
users = user;
if(users){
setLoggedIn(true)
}
}, [pathname]);
return isUserLoggedIn ? <PrivateRoutes /> : <PublicRoutes />;
}
export default Routes;
在 publicRoutes.js
// publicRoute.js
import React, { Component } from 'react';
import { HashRouter, Redirect, Route, Switch } from 'react-router-dom';
const loading = (
<div className="pt-3 text-center">
<div className="sk-spinner sk-spinner-pulse"></div>
</div>
)
// Pages
const Login = React.lazy(() => import('../views/pages/login/Login'));
const Register = React.lazy(() => import('../views/pages/register/Register'));
class PublicRoutes extends Component {
render() {
return (
<HashRouter>
<React.Suspense fallback={loading}>
<Switch>
<Route exact path="/register" name="Register Page" render={props => <Register {...props}/>} />
<Route path="/login" name="Login Page" render={props => <Login {...props}/>} />
<Route exact path="/register" name="Register Page" render={props => <Register {...props}/>} />
<Redirect to='/login' />
</Switch>
</React.Suspense>
</HashRouter>
);
}
}
export default PublicRoutes;
在私人路线中
/// privateRoute.js
import React, { Component } from 'react';
import { HashRouter, Route, Switch } from 'react-router-dom';
import '../scss/style.scss';
const loading = (
<div className="pt-3 text-center">
<div className="sk-spinner sk-spinner-pulse"></div>
</div>
)
// Containers
const TheLayout = React.lazy(() => import('../containers/TheLayout'));
// Pages
const Page404 = React.lazy(() => import('../views/pages/page404/Page404'));
const Page500 = React.lazy(() => import('../views/pages/page500/Page500'));
class PrivateRoutes extends Component {
render() {
return (
<HashRouter>
<React.Suspense fallback={loading}>
<Switch>
<Route exact path="/404" name="Page 404" render={props => <Page404 {...props}/>} />
<Route exact path="/500" name="Page 500" render={props => <Page500 {...props}/>} />
<Route path="/" name="Home" render={props => <TheLayout {...props}/>} />
</Switch>
</React.Suspense>
</HashRouter>
);
}
}
export default PrivateRoutes;
推荐阅读
- performance - 使用 TLS 的 Kafka 消费者。性能问题
- python - 如何将我的 2D numpy 数组转换为具有给定类别的 pandas 数据框?
- c# - Asp 网络安全网络 API
- django - Django 中的 Clearsessions 命令
- odata - 如何在不刷新模型的情况下批量设置属性()?
- esri - arcgis:加载 kml 文件,总计 80 兆字节(每个文件 10 兆字节)
- ubuntu-16.04 - 如何让 bazel 自动完成以重新开始工作?
- r - 查找文档的余弦相似度及其从 R 数据框中的删除
- ajax - Ajax / 如何使附加列表项“被选中”?
- android - 具有网格布局管理器的 Recyclerview 的相等填充