React中如何写动态路由?

How to write dynamic routing in React?

我在 React 中构建了一个应用程序并尝试进行动态路由,但我的应用程序没有等待 useEffect 结束。

我想在这里做的是从 localStorage 向我的后端发送一个对象,检查它并将它发送回前端。如果结果为真,当我输入“/form”时,我想转到“/form”路由,但如果为假,我想把他送回“/login”。

我尝试在 useState 工作时使用 useState 和一条消息,但没有用...

当我登录并尝试转到“/form”时,我的应用程序发现我的 useStates 为假并自动将我重定向到“/login”并且不等待我的提取结束。 ..

我该如何解决?

import { BrowserRouter as Router, Route, Routes, Navigate } from 'react-router-dom';
import Login from './views/Login';
import Logout from './views/Logout';
import AddUser from './views/AddUser';
import Movies from './views/Movies';
import Table_data from './components/Table_data';
import NavbarMenu from './views/NavbarMenu';
import { useSelector, useDispatch } from 'react-redux';
import 'bootstrap/dist/css/bootstrap.min.css';
import './App.css';
import { useEffect, useState } from 'react';
import { globalRequestParameters, url } from './utils';


function App() {
  const dispatch = useDispatch();
  const data = useSelector((state) => state.users.data);
  const [loggedIn, setLoggedIn] = useState(false);
  const [finishedCheking, setFinishedChecking] = useState(false);

  useEffect(() => {
    if (!data.length) {
      let requestParameters = globalRequestParameters;
      fetch(url + 'users', requestParameters)
        .then(res => res.json()
          .then(res => {
            if (res.message) {
              dispatch({ type: 'setUsers', payload: res.data })
            }
          })
        )
    }

    if (localStorage.getItem('is_logged_in')) {
      let check_loggedIn = JSON.parse(localStorage.getItem('is_logged_in'));
      let requestParam = globalRequestParameters;
      requestParam.method = 'POST';
      requestParam.headers.Authorization = JSON.stringify(check_loggedIn);
      fetch(url + 'check', requestParam)
          .then(res => res.json()
              .then(res => {
                  if (res.loggedIn === true) {
                    setLoggedIn(true);
                    setFinishedChecking(true);
                  }
              })
          )
    }
      
  }, [])

  return (
    <div>
      <NavbarMenu />
      {finishedCheking === false ? 
        <div>Loading...</div>
        :
        loggedIn === false ? 
        <Router>
          <Routes>
            <Route exact path="/" element={<Table_data />} />
            <Route exact path="/login" element={<Login />} />
            <Route exact path="/logout" element={<Logout />} />
            <Route exact path="/form" element={<AddUser />} />
            <Route exact path="/movies" element={<Movies />} />
          </Routes>
        </Router>
        :
        <Router>
        <Routes>
          <Route exact path="/" element={<Table_data />} />
          <Route exact path="/login" element={<Login />} />
          <Route exact path="/logout" element={<Logout />} />
          <Route exact path="/form" element={<Navigate replace to="/login" />}/>
          <Route exact path="/movies" element={<Movies />} />
        </Routes>
      </Router>
      }
    </div>
  );
}

export default App;

那是因为 fetchthen 这是一个承诺,这意味着它会在完成后解决它并在那个时候返回它。
要解决这个问题,您需要 const res = fetch(url + 'users', requestParameters) 并以相同的方式进一步使用它

用 {finishedChecking === true 包裹你的两个路由器? {两个路由器}:<>/>}。在 promise 中。然后将 finishedChecking 的值更改为 true。状态更改后,jsx 将再次呈现并进入条件,您将确保在那里您已经解决了您的承诺。如果您需要多个条件,那么您可以将它们堆叠起来 {finishedChecking === true && anotherVariable === true ? {两个路由器} : <> } 并在其他承诺中更改它们。