简体   繁体   English

“react-router-dom”中的私有路由:“6.0.0-beta.0”

[英]Private routes in "react-router-dom": "6.0.0-beta.0"

Please help me请帮我

When the Route is not inside <Routes> it gives an error: Error: A is only ever to be used as the child of element, never rendered directly.当 Route 不在<Routes>内时,它会给出错误:错误:A 只能用作元素的子元素,从不直接渲染。 Please wrap your in a请把你的包裹在一个

When it is inside <Routes> it give an error as: Error: [Abc] is not a <Route> component.当它在<Routes>内时,它会给出错误:错误:[Abc] 不是<Route>组件。 All component children of must be a <Route> or <React.Fragment>的所有子组件必须是<Route><React.Fragment>

Pls help me to resolve this situation?请帮我解决这种情况? Or any suggestion.或任何建议。

Tried this but one of the above error in both cases.在这两种情况下都尝试了上述错误之一。

As this does not generate an error, however my child component of the private route does not render.由于这不会产生错误,但是我的私有路由的子组件不会呈现。

import React from 'react'
import './App.css'
import { BrowserRouter, Routes, Route } from 'react-router-dom';

import Header from './components/Header'
import Home from './components/Home'
import Login from './components/Login'
import ProtectedRoute from './components/Helper/ProtectedRoute';
import { UserStorage } from './UserContext';
import User from './components/User';

const App = () => {
  return (
    <div>
      <BrowserRouter>
        <UserStorage>
          <>
            <Header />
            <Routes>
              <Route path="/" element={<Home />} />
              <Route path="login/*" element={<Login />} />
              <Route path='/conta' element={<ProtectedRoute/>}>
                <Route path='/conta' element={<User/>}/>
              </Route>
            </Routes>
          </>
        </UserStorage>
      </BrowserRouter>
    </div>
  )
}

export default App;

ProtectedRoute受保护的路由

import React from 'react';
import { UserContext } from '../../UserContext';
import {Routes, Route,  Navigate } from 'react-router-dom';

const ProtectedRoute = (props) => {
  const { login } = React.useContext(UserContext);

  if (login === true) return (
    <Routes>
      <Route {...props} />
    </Routes>
  );
  else if (login === false) return <Navigate to="/login" />;
  else return null;
};

export default ProtectedRoute;

With layout wrapper components like ProtectedRoute that renders nested Route components then you need to ensure it is rendering an Outlet for them to be rendered into.使用像ProtectedRoute这样的布局包装器组件渲染嵌套的Route组件,那么您需要确保它正在渲染一个Outlet以便将它们渲染到其中。

Outlet出口

import React from 'react';
import { UserContext } from '../../UserContext';
import {Routes, Route,  Navigate } from 'react-router-dom';

const ProtectedRoute = () => {
  const { login } = React.useContext(UserContext);

  if (login === undefined) return null;

  return login
    ? <Outlet /> // <-- nested Route components rendered here
    : <Navigate to="/login" replace />;
};

...

<Route path='/conta' element={<ProtectedRoute/>}>
  <Route path='/conta' element={<User/>}/> // <-- rendered into outlet
</Route>

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM