如何根据状态在 React 中重定向

How to Redirect in React based on State

我正在使用 useEffect 获取用户的登录状态 if (userLoggedIn === false) 那么我想立即重定向到登录路由,否则显示仪表板。

我的问题是仪表板显示一瞬间,然后发生重定向!我在 console.log 中测试了 userLoggedIn,它在第一次值未定义时打印两次,然后打印 false...

我认为发生这种情况是因为 state 的值是 (userLoggedIn) 一开始就没有设置,但是即使我将它设置为 false,例如它也会做同样的事情..

我正在使用后端的 useEffect 获取 (userLoggedIn) 值,我的代码是:-

import { useState, useEffect } from "react";
import {
  BrowserRouter as Router,
  Switch,
  Route,
  Redirect
} from "react-router-dom";
import Axios from "axios";

import ModalNotFound from "../../components/Modal/ModalNotFound";

//views
import Home from "./views/Home";
import Menu from "./views/Menu";
import Orders from "./views/Orders";
import AddFood from "./views/AddFood";
import EditFood from "./views/EditFood";
import About from "./views/About";

const DashboardContainer = () => {
  document.body.classList.add("dashboard");

  const [userLoggedIn, setUserLoggedIn] = useState(false);

  Axios.defaults.withCredentials = true;

  useEffect(() => {
    Axios.get("http://dev.com:3001/login")
      .then(({ data }) => setUserLoggedIn(data.loggedIn))
      .catch((err) => console.error(err));

    return () => setUserLoggedIn(); // cleanup: set the value to nothing
  }, []);

  console.log(userLoggedIn);

  return (
    <>
      {userLoggedIn === false ? (
        <Redirect to='/login' />
      ) : (
        <Router>
          <Switch>
            <Route exact strict path='/dashboard' component={Home} />
            {/* if user accesses /dashboard/ then remove ending slash / bcuz it messes the links*/}
            <Route exact strict path='/dashboard/'>
              <Redirect to='/dashboard' />
            </Route>
            <Route exact strict path='/dashboard/menu' component={Menu} />
            <Route exact strict path='/dashboard/orders' component={Orders} />
            <Route
              exact
              strict
              path='/dashboard/add-food'
              component={AddFood}
            />
            <Route
              exact
              strict
              path='/dashboard/edit-food'
              component={EditFood}
            />
            <Route exact strict path='/dashboard/about' component={About} />

            <Route path='*' component={ModalNotFound} />
          </Switch>
        </Router>
      )}
    </>
  );
};

export default DashboardContainer;

对于 EndPoint/Back-end (http://dev.com:3001/login) 我正在使用此代码:-

module.exports = (req, res) => {
  if (req.session.user) {
    res.send({ loggedIn: true, user: req.session.user });
  } else {
    res.send({ loggedIn: false });
  }
};

如您所说,console.log 打印两次,第一次 userLoggedIn 未定义 。由于 userLoggedIn 不等于 false,因此仪表板显示在此处,它转到显示仪表板的代码。

为防止首次渲染,您可以包装 return

return (
        { userLoggedIn !== undefined && {/* your code */} }
       );