# #reactjs #firebase #react-router-dom
#реагирует на #огневая база #реагировать-маршрутизатор-дом
Вопрос:
Я построил собственный маршрут с помощью проверки подлинности API из опорного пункта V9 и реагировать-маршрутизатор-дом V6 и получить доступ к админ-части, когда я войти в его перенаправить меня на страницу администрирования, но страница пустая и консоль лог это «реагировать.jsx: тип недопустим-ожидается строка (для встроенных компонентов) или класс/функция (для составных компонентов), но получил: не определен.» И попросите меня «Проверить ваш код на PrivateRoute.jsx:7″. Спасибо вам за вашу помощь =).
Приватный маршрут.jsx
import React from 'react' import {Navigate} from 'react-router-dom' import { auth } from '../../Firebase' function PrivateRoute({component: Component}) { const user = auth.currentUser return user ? lt;Component /gt; : lt;Navigate to='/login'/gt; } export default PrivateRoute
App.jsx (где используется частный маршрут)
import {BrowserRouter, Route, Routes } from 'react-router-dom'; import Admin from './Components/Admin/Admin' function App() { return ( lt;BrowserRoutergt; lt;div className="App"gt; lt;Routesgt; lt;Route path="/admin" element={ lt;PrivateRoutegt; lt;Admin /gt; lt;/PrivateRoutegt; } /gt; lt;/Routesgt; lt;/divgt; lt;/BrowserRoutergt; ); } export default App;
Я даю вам файл Firebase и AuthContext, чтобы выяснить
Firebase.js
import {initializeApp} from 'firebase/app' import {serverTimestamp, getFirestore} from 'firebase/firestore' import {getStorage} from 'firebase/storage' import {getAuth} from'firebase/auth' const firebaseConfig = { config } const app = initializeApp(firebaseConfig) export const timestamp = serverTimestamp() export const projectFirestore= getFirestore(app) export const projectStorage= getStorage(app) export const auth = getAuth(app) export default app
AuthContext.jsx
import {useContext, useState, useEffect, createContext} from 'react' import { auth } from '../../Firebase' import { createUserWithEmailAndPassword, signInWithEmailAndPassword, signOut, onAuthStateChanged} from "firebase/auth"; const AuthContext = createContext() export function useAuth() { return useContext(AuthContext) } export function AuthProvider({children}) { const [currentUser, setCurrentUser] = useState() const [loading, setLoading] = useState(true) function register(email, password){ return createUserWithEmailAndPassword(auth, email, password) } function login(email, password){ return signInWithEmailAndPassword(auth, email, password) } function logout() { signOut(auth) } useEffect(() =gt;{ const unsubscribe = onAuthStateChanged(auth ,(user) =gt; { setCurrentUser(user) setLoading(false) }) return unsubscribe }, []) const value = { currentUser, login, register, logout } return ( lt;AuthContext.Provider value={value}gt; {!loading amp;amp; children} lt;/AuthContext.Providergt; ) }
Комментарии:
1. Можете ли вы поделиться тем, как/где вы используете этот
PrivateRoute
компонент и как он отображается? В React-router-dom v6 есть довольно много важных изменений, и одно из них-это то, что пользовательские компоненты маршрута больше не используются.2. Да, я читал документы, но многого я не понял. Я добавлю это к запросу.
Ответ №1:
Способ аутентификации в RRDv6 значительно изменился по сравнению с v5. Исчезли пользовательские компоненты маршрута, замененные компонентами-оболочками.
Дано:
lt;BrowserRoutergt; lt;div className="App"gt; lt;Routesgt; lt;Route path="/admin" element={( lt;PrivateRoutegt; lt;Admin /gt; lt;/PrivateRoutegt; )} /gt; lt;/Routesgt; lt;/divgt; lt;/BrowserRoutergt;
PrivateRoute
Оболочке просто нужно отобразить свою children
опору вместо component
опоры.
function PrivateRoute({ children }) { const user = auth.currentUser; return user ? children : lt;Navigate to='/login' replace /gt;; }
Однако распространенным шаблоном является визуализация в Outlet
компоненте вместо этого и перенос вложенных защищенных маршрутов.
Пример:
import { Navigate, Outlet } from 'react-router-dom'; const PrivateWrapper = () { const user = auth.currentUser; return user ? lt;Outlet /gt; : lt;Navigate to='/login' replace /gt;; }
…
lt;BrowserRoutergt; lt;div className="App"gt; lt;Routesgt; lt;Route path="/admin" element={lt;PrivateWrapper /gt;} gt; lt;Route path="/admin" element={lt;Admin /gt;} /gt; ... other nested protected routes ... lt;/Routegt; lt;/Routesgt; lt;/divgt; lt;/BrowserRoutergt;
Комментарии:
1. Большое спасибо =’). Последний вопрос, что вы поставили «заменить» в навигаторе ?
2. Из того, что я понимаю об изменениях, мне не нужна отдушина для моего дела.
3. @PazzeG О, он используется для указания на то, что навигация должна быть перенаправлением по сравнению с обычной PUSH-навигацией. Ре:
Outlet
Я просто стараюсь быть внимательным.