防止浏览器在我的控制台上挂起的导航限制措施
P粉226413256
P粉226413256 2023-08-16 08:43:57
0
1
450
<p>为仪表板页面创建了一个PrivateRoute,未登录时无法通过URL访问,但刷新仪表板页面会导致重定向到身份验证页面。因此,我添加了一个sessionStorage,但是现在刷新时在我的控制台上显示"throttling navigation to prevent the browser from hanging",因为它一直在不停地重定向到页面。</p> <p>//以下是代码</p> <p>//App.js</p> <pre class="brush:php;toolbar:false;">import { BrowserRouter as Router, Routes, Route } from "react-router-dom"; import Dashboard from "./components/dashboard"; import Auth from "./components/auth"; import PrivateRoute from "./PrivateRoute"; function App() { return ( &lt;Router&gt; &lt;Routes&gt; &lt;Route path="/signin" element={&lt;Auth /&gt;} /&gt; &lt;Route path="/dashboard" element={&lt;PrivateRoute&gt; &lt;Dashboard /&gt;&lt;/PrivateRoute&gt;} /&gt; &lt;/Routes&gt; &lt;/Router&gt; ); } export default App;</pre> <p>//PrivateRoute.js</p> <pre class="brush:php;toolbar:false;">import { Navigate } from "react-router-dom"; import { auth } from "./config/firebase"; function PrivateRoute({ children }) { const user = auth.currentUser; // 检查用户是否已经通过身份验证 if (!user) { // 用户未通过身份验证,重定向到登录页面 return &lt;Navigate to="/signin" replace/&gt;; } // 用户已通过身份验证,渲染受保护的路由 return children; } export default PrivateRoute;</pre> <p>//Auth.js</p> <pre class="brush:php;toolbar:false;">import { useEffect, useState } from "react"; import { useNavigate } from "react-router-dom"; import { auth, googleProvider } from "../config/firebase"; import { createUserWithEmailAndPassword, signInWithPopup, signOut, } from "firebase/auth"; function Auth () { const [email, setEmail] = useState(""); const [password, setPassword] = useState(""); const navigate = useNavigate(); console.log(auth?.currentUser?.email); useEffect(()=&gt; { const userFromStorage = JSON.parse(sessionStorage.getItem("user")); if(userFromStorage){ console.log(userFromStorage); navigate("/dashboard"); } } , [navigate]); const signIn = async () =&gt; { try { await createUserWithEmailAndPassword(auth, email, password); sessionStorage.setItem("user" , JSON.stringify(auth.currentUser)); navigate("/dashboard"); } catch (err) { console.error(err); } }; const signInWithGoogle = async () =&gt; { try { await signInWithPopup(auth, googleProvider); sessionStorage.setItem("user", JSON.stringify(auth.currentUser)); navigate("./dashboard"); } catch (err) { console.error(err); } }; const Logout = async () =&gt; { try { await signOut(auth); sessionStorage.removeItem("user"); } catch (err) { console.error(err); } }; return ( &lt;div&gt; &lt;input placeholder="email" onChange={(e) =&gt; setEmail(e.target.value)} /&gt; &lt;input type="password" placeholder="password" onChange={(e) =&gt; setPassword(e.target.value)} /&gt; &lt;button onClick={signIn}&gt;sign in&lt;/button&gt; &lt;button onClick={signInWithGoogle}&gt;sign in with Google&lt;/button&gt; &lt;button onClick={Logout}&gt;Logout&lt;/button&gt; &lt;/div&gt; ); }; export default Auth;</pre> <p>不想要这个错误,作为一个初学者,如果有改进的空间,请随时告诉我。</p>
P粉226413256
P粉226413256

répondre à tous(1)
P粉337385922

您应该异步处理身份验证状态。

import { useEffect, useState } from 'react';
import { Navigate } from 'react-router-dom';
import { auth } from './config/firebase';

function PrivateRoute({ children }) {
  const [isAuthenticated, setIsAuthenticated] = useState(false);
  const [loading, setLoading] = useState(true);

  useEffect(() => {
    // 观察用户身份验证变化
    const unsubscribe = auth.onAuthStateChanged((user) => {
      if (user) {
        setIsAuthenticated(true);
      } else {
        setIsAuthenticated(false);
      }
      setLoading(false);
    });

    // 当组件卸载时取消订阅
    return () => unsubscribe();
  }, []);

  if (loading) return <div>加载中...</div>; // 可选的加载指示器

  if (!isAuthenticated) {
    return <Navigate to="/signin" replace />;
  }

  return children;
}

export default PrivateRoute;
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!