(реагировать маршрутизатор v6) «Ошибка: useNavigate() может использоваться только в контексте компонента » ошибка в специальном компоненте

#javascript #reactjs

Вопрос:

В разделе Маршрутизатор я пытаюсь проверить, имеет ли пользователь доступ к компоненту, используя компонент более высокого порядка (hoc).

Поэтому проверьте, вошел ли пользователь в систему в данный момент. В это время попытка доступа к каждой странице может быть предотвращена или вынуждена перейти на другую страницу в соответствии со значением ответа.

Чтобы перейти на другую страницу, нам нужно использовать метод «навигация» в специальном компоненте.

Однако при использовании метода навигации "Error: use Navigate() may be used only in the context of a lt;Routergt; component" появляется фраза.

Поскольку в маршрутизаторе используется hoc, я собираюсь использовать навигацию. Я думаю, что смогу это сделать.

Вы можете сказать мне, в чем проблема? Что я здесь упускаю? Это мой первый раз, когда я пытаюсь использовать бэкэнд, поэтому, пожалуйста, поймите.

src/App.js

 import './App.css'; import {  BrowserRouter as Router,  Routes,  Route,  Link } from "react-router-dom"; import LandingPage from "./components/views/LandingPage/LandingPage"; import LoginPage from "./components/views/LoginPage/LoginPage"; import RegisterPage from "./components/views/RegisterPage/RegisterPage"; import Auth from "./hoc/auth"; //lt;-- this is hoc!!!!!!!!!!!!!!  function App() {  return (  lt;Routergt;  lt;divgt;  lt;Routesgt;  lt;Route path="/" element={Auth(LandingPage, null)}/gt;  lt;Route path="/login" element={Auth(LoginPage, false)}/gt;  lt;Route path="/register" element={Auth(RegisterPage, false)}/gt;  lt;/Routesgt;  lt;/divgt;  lt;/Routergt;  ); } export default App;   

src/hoc/auth.js (Авт.)

 import React, { useEffect } from "react"; import axios from "axios"; import {useDispatch} from "react-redux"; import {auth} from "../_actions/user_action"; import { useNavigate } from "react-router-dom";  export default function(SpecificComponent, option, adminRoute = null){    function AuthenticationCheck(props){  let navigate = useNavigate(); //lt;-- this doesn't work!!!!  const dispatch = useDispatch();    useEffect(()=gt; {  dispatch(auth()).then(response =gt; {  console.log(response);    if(!response.payload.isAuth){  if(option){  navigate('/login');//lt;-- this doesn't work!!!!  }  } else {  if(adminRoute amp;amp; !response.payload.isAdmin){navigate('/')}   else {   if(option === false){ navigate('/'); //lt;-- this doesn't work!!!!}  }  }  })  },[])  return (  lt;SpecificComponent/gt;  )  }    return AuthenticationCheck(); }  

index.js

 import React from 'react'; import ReactDOM from 'react-dom'; import './index.css'; import App from './App'; import reportWebVitals from './reportWebVitals'; import "antd/dist/antd.css"; import {Provider} from "react-redux"; import {applyMiddleware, createStore} from "redux"; import promiseMiddleware from "redux-promise"; import ReduxThunk from "redux-thunk"; import Reducer from "./_reducers";  const createStoreWithMiddleware = applyMiddleware(promiseMiddleware, ReduxThunk)(createStore);   ReactDOM.render(  lt;Provider store={createStoreWithMiddleware(Reducer,  window.__REDUX_DEVTOOLS_EXTENSION__ amp;amp; window.__REDUX_DEVTOOLS_EXTENSION__()  )}gt;  lt;App /gt;  lt;/Providergt;,  document.getElementById('root') );  reportWebVitals();  

Ответ №1:

Обновите свой HOC как

Note: Calling a component as Function rather than JSX Element may lead to unexpected bugs and also creates issues with the usage of Hooks.

 import {BrowserRouter, Routes, Route, useNavigate} from "react-router-dom";  function ActualComp(navigate){  console.log(navigate)  return lt;gt;Actual Complt;/gt; }  function HOC(SpecificComponent, option, adminRoute = null){    function AuthenticationCheck(props){  let navigate = useNavigate();   return (  lt;SpecificComponent navigate={navigate} /gt;  )  }    return lt;AuthenticationCheck /gt;; lt;---- Here instead of `AuthenticationCheck()` }  function App() {  return (  lt;divgt;  lt;BrowserRoutergt;  lt;Routesgt;  lt;Route path="/" element={HOC(ActualComp)} /gt;  lt;/Routesgt;  lt;/BrowserRoutergt;  lt;/divgt;  ); }  export default App;  

Ответ №2:

Вы можете использовать компонент перенаправления:

 import { Redirect, useHistory} from 'react-router-dom'; ...  const history = useHistory(); lt;Redirect  to={{  pathname: '/login',  state: { from: history.location },  }} /gt;  

или измените местоположение:

 window.location.href = '/login';