import { Navigate } from "react-router-dom";
import RootLayOut from "./components/layout/RootLayOut";
import { useEffect, useRef, useState } from "react";

const Protected = () => {
  const data = localStorage.getItem("token");
  const [isAuthenticated, setIsAuthenticated] = useState(false);
  //const isAuthenticated = useRef(false);
  useEffect(() => {
    const verifyToken = async () => {
      try {
        const response = await fetch("http://172.23.30.165:5000/verify_token", {
          headers: { "Content-Type": "application/json" },
          method: "POST",
          body: JSON.stringify(data), // data = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9..."
        });
        if (response.ok) {
          const resData = await response.json();
          console.log("In protected" + JSON.stringify(resData));
          if (resData) {
            setIsAuthenticated(true);
            console.log(isAuthenticated);
          } else {
            console.log("user is inauthenticated.");
          }
        }
      } catch (error) {
        console.error("Error verifying data:", error);
      }
    };
    verifyToken();
  }, [data, isAuthenticated]);

  return <>{isAuthenticated ? <RootLayOut /> : <Navigate to="/login" />}</>; // even though the console.log(isAuthenticated) runs
  // and return null, the isAuthenticated variable is still null
  // thus it never runs my <RootLayOut/> component
};

export default Protected;

我希望Protected组件在成功执行"console.log(isAuthenticated);"这一行后呈现RootLayOut组件,但它从不呈现预期的组件,而只是呈现

推荐答案

您可以使用navigate('/login');以编程方式触发它,而不是使用html导航

Protected.js

import { useNavigate } from "react-router-dom";
import RootLayOut from "./components/layout/RootLayOut";
import { useEffect, useState } from "react";

const Protected = () => {
  let navigate = useNavigate();
  const data = localStorage.getItem("token");
  const [isAuthenticated, setIsAuthenticated] = useState(false);
  //const isAuthenticated = useRef(false);
  useEffect(() => {
    const verifyToken = () => {
      try {
        const response = {ok: false};/* await fetch("http://172.23.30.165:5000/verify_token", {
          headers: { "Content-Type": "application/json" },
          method: "POST",
          body: JSON.stringify(data), // data = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9..."
        }); */
        if (response.ok) {
          const resData = response;
          console.log("In protected" + JSON.stringify(resData));
          if (resData) {
            setIsAuthenticated(true);
            console.log(isAuthenticated);
          } else {
            console.log("user is inauthenticated.");
            setIsAuthenticated(false);
            navigate('/login');
          }
        } else {
          console.log("user is inauthenticated.");
          setIsAuthenticated(false);
          navigate('/login');
        }
      } catch (error) {
        console.error("Error verifying data:", error);
      }
    };
    verifyToken();
  }, [data, isAuthenticated]);

  return <>{isAuthenticated ? <RootLayOut /> : null}</>; // even though the console.log(isAuthenticated) runs
  // and return null, the isAuthenticated variable is still null
  // thus it never runs my <RootLayOut/> component
};

export default Protected;

App.js

import RootLayOut from "./components/layout/RootLayOut.js";
import Sell from "./page/Sell.js";
import Login from "./page/Login/Login.js";
import Register from "./page/Register/Register.js";
import Home from "./page/Home/Home.js";
import "./App.css";
import Market from "./components/Market.js";
import {
  createBrowserRouter,
  createRoutesFromElements,
  Route,
  RouterProvider,
  Navigate,
} from "react-router-dom";
import { useState, useEffect } from "react";
import Protected from "./Protected.js";

const router = createBrowserRouter(
  createRoutesFromElements(
    <>
      <Route path="/" element={<Protected />}>
        <Route
           exact path="/"
          element={<Navigate to="/home" replace={true} />}
        />
        <Route path="market" element={<Market />} />
        <Route path="sell" element={<Sell />} />
        <Route path="home" element={<Home />} />
        <Route path="logout" element={<div>logout</div>} />
      </Route>
      <Route path="/register" element={<Register />} />
      <Route path="/login" element={<Login />} />

    </>
  )
);

function App() {
  return <RouterProvider router={router} />;
}
export default App;

stackblitz

Reactjs相关问答推荐

如何使用mui为可重复使用的react 按钮应用不同的风格

如何将google地址lat收件箱设置为输入值?

在react中向数组状态添加值时出错

Next.js-图像组件加载问题

如何将Redux工具包添加到expo (SDK 50)项目?

如何在react 流中使用文本区域和改变 node 的输入大小?

导致useState中断的中断模式

在Reaction中导入';图片&文件夹时出错

是否为Reaction中未使用的组件生成Tailwincss样式?

点击页脚链接时,如何更改ReactJS导航栏中的活动菜单项(样式为Tailwind CSS)?

如何管理组件列表的复杂状态? (Nextjs/ReactJS)

预期无限重新渲染但没有发生

无法使用react-hook-form和react-places-autocomplete在字段中输入值

显示我是否加入聊天应用程序时出现问题

使用D3.js绘制和展示弦图的右下方象限

使用 react pro 侧边栏展开折叠菜单

MUI TextField Select 菜单的最大高度

react - 警告:列表中的每个子元素都应该有一个独特的 keys props ,即使我已经设置了 keys

我正在try 使用 cypress 测试我的下拉列表,它 Select 值但不提交它们(手动工作)

如何解决在 react.js 中找不到模块错误