1. ホーム
  2. javascript

[解決済み] エラー [PrivateRoute]は<Route>コンポーネントではありません。<Routes> の子コンポーネントはすべて <Route> または <React.Fragment> でなければなりません。

2023-05-28 22:26:02

質問

React Router v6を使用しており、アプリケーションにプライベートルートを作成しています。

ファイル内の PrivateRoute.js には、次のようなコードがあります。

import React from 'react';
import {Route,Navigate} from "react-router-dom";
import {isauth}  from 'auth'

function PrivateRoute({ element, path }) {
  const authed = isauth() // isauth() returns true or false based on localStorage
  const ele = authed === true ? element : <Navigate to="/Home"  />;
  return <Route path={path} element={ele} />;
}

export default PrivateRoute

また、ファイル中の ルート.js として書いています。

 ...
<PrivateRoute exact path="/" element={<Dashboard/>}/>
<Route exact path="/home" element={<Home/>}/>

同じ例で React-router Auth の例 - StackBlitz, ファイル App.tsx

何か見逃しているものはありますか?

どのように解決するのですか?

今日、同じ問題にぶつかり、これを元に次のような解決策を思いつきました。 非常に役に立つ記事 によって アンドリュー・ルカ

PrivateRoute.jsで。

import React from 'react';
import { Navigate, Outlet } from 'react-router-dom';

const PrivateRoute = () => {
    const auth = null; // determine if authorized, from context or however you're doing it

    // If authorized, return an outlet that will render child elements
    // If not, return element that will navigate to login page
    return auth ? <Outlet /> : <Navigate to="/login" />;
}

App.jsで(例として他のページも残しています)。

import './App.css';
import React, {Fragment} from 'react';
import {BrowserRouter as Router, Route, Routes} from 'react-router-dom';
import Navbar from './components/layout/Navbar';
import Home from './components/pages/Home';
import Register from './components/auth/Register'
import Login from './components/auth/Login';
import PrivateRoute from './components/routing/PrivateRoute';

const App = () => {
  return (
    <Router>
      <Fragment>
        <Navbar/>
        <Routes>
          <Route exact path='/' element={<PrivateRoute/>}>
            <Route exact path='/' element={<Home/>}/>
          </Route>
          <Route exact path='/register' element={<Register/>}/>
          <Route exact path='/login' element={<Login/>}/>
        </Routes>
      </Fragment>
    </Router>
    
  );
}

上記のルーティングでは、これがプライベートルートになります。

<Route exact path='/' element={<PrivateRoute/>}>
      <Route exact path='/' element={<Home/>}/>
</Route>

認証に成功した場合、この要素は表示されます。そうでない場合は、ログインページに移動します。