So verwenden Sie react-router-dom
Erstellen Sie eine geschützte Route und speichern Sie die Antwort in localStorage, damit der Benutzer die Details beim nächsten Öffnen erneut anzeigen kann. Nach der Anmeldung sollten Sie zur Dashboard-Seite weitergeleitet werden.
Alle Funktionen werden in ContextApi hinzugefügt.
Codesandbox-Link: Code
Ich habe es versucht, konnte es aber nicht schaffen.
Routing-Seite
import React, { useContext } from "react"; import { globalC } from "./context"; import { Route, Switch, BrowserRouter } from "react-router-dom"; import About from "./About"; import Dashboard from "./Dashboard"; import Login from "./Login"; import PageNotFound from "./PageNotFound"; function Routes() { const { authLogin } = useContext(globalC); console.log("authLogin", authLogin); return ( <BrowserRouter> <Switch> {authLogin ? ( <> <Route path="/dashboard" component={Dashboard} exact /> <Route exact path="/About" component={About} /> </> ) : ( <Route path="/" component={Login} exact /> )} <Route component={PageNotFound} /> </Switch> </BrowserRouter> ); } export default Routes;
Kontextseite
import React, { Component, createContext } from "react"; import axios from "axios"; export const globalC = createContext(); export class Gprov extends Component { state = { authLogin: null, authLoginerror: null }; componentDidMount() { var localData = JSON.parse(localStorage.getItem("loginDetail")); if (localData) { this.setState({ authLogin: localData }); } } loginData = async () => { let payload = { token: "ctz43XoULrgv_0p1pvq7tA", data: { name: "nameFirst", email: "internetEmail", phone: "phoneHome", _repeat: 300 } }; await axios .post(`https://app.fakejson.com/q`, payload) .then((res) => { if (res.status === 200) { this.setState({ authLogin: res.data }); localStorage.setItem("loginDetail", JSON.stringify(res.data)); } }) .catch((err) => this.setState({ authLoginerror: err }) ); }; render() { // console.log(localStorage.getItem("loginDetail")); return ( <globalC.Provider value={{ ...this.state, loginData: this.loginData }} > {this.props.children} </globalC.Provider> ); } }
对于v6:
链接到文档: https://gist.github.com/mjackson/d54b40a094277b7afdd6b81f51a0393f
问题
Switch
不处理除Route
和Redirect
组件之外的任何渲染。如果你想要像这样“嵌套”,那么你需要将每个组件包装在通用的路由中,但这完全是不必要的。你的登录组件也没有处理重定向回原来访问的“主页”或私有路由。
解决方案
react-router-dom
v6在版本6中,自定义路由组件已经不再流行,推荐的方法是使用身份验证布局组件。
...
或者
...
react-router-dom
v5创建一个消费您的身份验证上下文的
PrivateRoute
组件。更新您的
Login
组件以处理重定向回原来访问的路由。在“平面列表”中渲染所有路由