在路由器部分,我嘗試檢查用戶是否可以使用高階組件 (hoc) 訪問該組件。
因此,請檢查用戶是否在 hoc 登錄。此時,可以根據回應值阻止或強制移動到另一個頁面的嘗試訪問每個頁面。
為了移動到另一個頁面,我們需要使用 hoc 組件中的“導航”方法。
但是,在使用導航方法時,會"Error: use Navigate() may be used only in the context of a <Router> component"出現該短語。
由于在路由器中使用了 hoc,我將使用 Navigate。我想我可以做到。
你能告訴我是什么問題嗎?我在這里錯過了什么?這是我第一次嘗試后端,所以請理解。
源代碼/應用程式.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"; //<-- this is hoc!!!!!!!!!!!!!!
function App() {
return (
<Router>
<div>
<Routes>
<Route path="/" element={Auth(LandingPage, null)}/>
<Route path="/login" element={Auth(LoginPage, false)}/>
<Route path="/register" element={Auth(RegisterPage, false)}/>
</Routes>
</div>
</Router>
);
}
export default App;
src/hoc/auth.js (Auth)
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(); //<-- this doesn't work!!!!
const dispatch = useDispatch();
useEffect(()=> {
dispatch(auth()).then(response => {
console.log(response);
if(!response.payload.isAuth){
if(option){
navigate('/login');//<-- this doesn't work!!!!
}
} else {
if(adminRoute && !response.payload.isAdmin){navigate('/')}
else {
if(option === false){ navigate('/'); //<-- this doesn't work!!!!}
}
}
})
},[])
return (
<SpecificComponent/>
)
}
return AuthenticationCheck();
}
索引.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(
<Provider store={createStoreWithMiddleware(Reducer,
window.__REDUX_DEVTOOLS_EXTENSION__ && window.__REDUX_DEVTOOLS_EXTENSION__()
)}>
<App />
</Provider>,
document.getElementById('root')
);
reportWebVitals();
uj5u.com熱心網友回復:
您可以使用重定向組件:
import { Redirect, useHistory} from 'react-router-dom';
...
const history = useHistory();
<Redirect
to={{
pathname: '/login',
state: { from: history.location },
}}
/>
或更改位置:
window.location.href = '/login';
uj5u.com熱心網友回復:
將您的 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 <>Actual Comp</>
}
function HOC(SpecificComponent, option, adminRoute = null){
function AuthenticationCheck(props){
let navigate = useNavigate();
return (
<SpecificComponent navigate={navigate} />
)
}
return <AuthenticationCheck />; <---- Here instead of `AuthenticationCheck()`
}
function App() {
return (
<div>
<BrowserRouter>
<Routes>
<Route path="/" element={HOC(ActualComp)} />
</Routes>
</BrowserRouter>
</div>
);
}
export default App;
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/367568.html
標籤:javascript 反应
