【问题标题】:React Router V6 Routing [duplicate]React Router V6路由[重复]
【发布时间】:2021-11-06 21:23:34
【问题描述】:

我正在尝试使用新发布的路由器实现 PrivateRoute 逻辑,但它似乎无法按预期工作..


import { Route, Routes, Navigate } from "react-router-dom";

import LogInPage from "./pages/LogIn";
import DashboardPage from "./pages/Dashboard";

function PrivateRoute({ path, element }) {
  const auth = true;

  return (
    <Route
      path={path}
      element={auth === true ? element : <Navigate replace to="/login" />}
    />
  );
}

function App() {
  return (
    <Routes>
      <Route path="/*" element={<PageNotFound />} />
      <Route path="/" element={<Navigate replace to="/dashboard" />} />
      <Route path="/login" element={<LogInPage />} />
      <PrivateRoute
        path="/dashboard"
        element={<DashboardPage />}
      />
    </Routes>
  );
}

export default App;


我错过了什么?如果 PrivateRoute 组件返回 Route,它是否仍然是 Route 组件?

【问题讨论】:

  • 私有路由见官方 react-router v6 auth example
  • 谢谢,我尝试了您提到的方式,并且效果很好。不幸的是,我对上面指定的方式更感兴趣,如果它有效...对我来说,这似乎更方便,而不是包装每个元素RequireAuth 组件中的路由..
  • 另一种选择是使用公共路径分隔公共和私有路由。例如,/* 的任何内容都是公开的,/app/* 的任何内容都是私有的。这些Routes 将包含父elements,其中包含一个Routes 组件,该组件包装了它们各自的Route 组件。在私有父组件的顶层,您将检查身份验证。如果通过,则落入私有Routes开关;否则,您可以重定向/显示叠加层。

标签: reactjs react-router react-router-dom


【解决方案1】:

You cannot composeRoutes 在 React Router v6 中。相反,在与其他路由相同的级别创建路由,并在 element 属性中使用您的 PrivateRoute 组件。示例(source):

import { Routes, Route, Navigate } from "react-router-dom";

function App() {
  return (
    <Routes>
      <Route path="/public" element={<PublicPage />} />
      <Route
        path="/protected"
        element={
          // Good! Do your composition here instead of wrapping <Route>.
          // This is really just inverting the wrapping, but it's a lot
          // more clear which components expect which props.
          <RequireAuth redirectTo="/login">
            <ProtectedPage />
          </RequireAuth>
        }
      />
    </Routes>
  );
}

function RequireAuth({ children, redirectTo }) {
  let isAuthenticated = getAuth();
  return isAuthenticated ? children : <Navigate to={redirectTo} />;
}

【讨论】:

  • 谢谢,这就是我最终的做法。
【解决方案2】:

React V6 中的路由

  1. 用于在网站中有多个页面的情况下进行导航。我们不需要重新渲染整个网站来导航到不同的页面 每次,向服务器发出 fetch 请求。
  2. 整个 javascript 一次被 fecthed,然后由 react-router-dom 管理,用于导航的第三方库。
   //npm install react-router-dom
   
   <BrowserRouter>
     <Routes>
       <Route path='' element='' exact> //exact is used to load only the specified matched path
       <Route path='' element=''>
        .
        . 
     </Routes>
   </BrowserRouter>
  1. 重定向:- 将路径重定向到现有路径。
        import { Routes,Routes,Navigate } from 'react-router-dom'
        <Routes>
           <Route path='/learn' element={<Learn/>}/>
           <Route path='/learn-apps' element={<Navigate replace to="/learn"/>}/>
        </Routes>     
    
  2. 从路由路径中提取参数:-
            //define a path like this
            <Route path=":courseid" element={<CourseId/>}/>
    
            //In the component use react router hook 
            function CourseId(){
              let {courseid} = useParams();
              return (
                <div>
                  <h1>Your Course Id is : {courseid}</h1>
                </div>
              );
            }
    
    
  3. 将信息从一条路线传送到另一条路线。
    • 对于这个功能,我们必须使用两个钩子,即 useNavigate,useLocation
    • 假设我们将信息从 courseId 组件传送到 Dashboard ,此后路线已更改,因此要传递一些信息:-
    • 在这里,每当用户单击 courseId 组件上的按钮到新路由(即仪表板)时,我们都会传递一个包含价格的对象
    • 
         function CourseId(){
           //useNavigate is imported from react-router-dom
           let navigate = useNavigate();
           let {courseid} = useParams();
           return (
               <div>
                 <h1>Your Course Id is : {courseid} </h1>
                 <button
                   onClick={() => {
                     navigate("/dashboard",{ state: {
                       price : "399"
                     } });
                   }}
                 >Pass information</button>
               </div>
             );
           }
      
           function Dashboard(){
               const location = useLocation();
               return(
                 <div>
                   <h1>Info that I got here is {location.state.price} </h1>
                 </div>
               );
             }
      
      • 另一种简单的方法是使用链接
      • 
           //Route intial
           <Link to="/dashboard" state={"DJANGO"}>Dashboard</Link>
        
           //Route final
           const location = useLocation();
           <h1>Info that I got here is {location.state} </h1>
        

Sources : Youtube

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-03
    • 2022-07-09
    • 1970-01-01
    • 2022-08-14
    • 2022-08-02
    • 2021-12-28
    • 1970-01-01
    • 2021-12-30
    相关资源
    最近更新 更多