Erstellen geschützter Routen: eine Anleitung mit React-Router-Dom
P粉596191963
2023-08-24 11:22:28
<p>So verwenden Sie <code>react-router-dom</code>, um eine geschützte Route zu erstellen und die Antwort in localStorage zu speichern, damit der Benutzer seine Details beim nächsten Öffnen erneut anzeigen kann. Nach der Anmeldung sollten sie zur Dashboard-Seite weitergeleitet werden. </p>
<p>Alle Funktionen werden in ContextApi hinzugefügt.Codesandbox链接:Code</p>
<p>我尝试过,但无法实现</p>
<p>路由页面</p>
<pre class="brush:php;toolbar:false;">import React, { useContext } from "react";
import { globalC } from "./context";
import { Route, Switch, BrowserRouter } aus „react-router-dom“;
import About from „./About“;
Dashboard aus „./Dashboard“ importieren;
Login importieren von „./Login“;
importiere PageNotFound aus „./PageNotFound“;
Funktion Routes() {
const { authLogin } = useContext(globalC);
console.log("authLogin", authLogin);
zurückkehren (
<BrowserRouter>
<Schalter>
{authLogin ? (
<>
<Route path="/dashboard" Component={Dashboard} Exact />
<Exakter Pfad zur Route="/About" Component={About} />
</>
) : (
<Route path="/" Component={Login} Exact />
)}
<Route Component={PageNotFound} />
</Schalter>
</BrowserRouter>
);
}
Standardrouten exportieren;</pre>
<p>上下文页面</p>
<pre class="brush:php;toolbar:false;">import React, { Component, createContext } from "react";
Axios aus „axios“ importieren;
export const globalC = createContext();
Die Exportklasse Gprov erweitert Component {
Zustand = {
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“,
Daten: {
Name: „nameFirst“,
E-Mail: „internetEmail“,
Telefon: „phoneHome“,
_Wiederholung: 300
}
};
warte auf Axios
.post(`https://app.fakejson.com/q`, Nutzlast)
.then((res) => {
if (res.status === 200) {
this.setState({
authLogin: res.data
});
localStorage.setItem("loginDetail", JSON.stringify(res.data));
}
})
.catch((err) =>
this.setState({
authLoginerror: Fehler
})
);
};
render() {
// console.log(localStorage.getItem("loginDetail"));
zurückkehren (
<globalC.Provider
Wert={{
...Dieser Staat,
loginData: this.loginData
}}
>
{this.props.children}
</globalC.Provider>
);
}
}</pre>
<p><br /></p>
对于v6:
文档链接: https://gist.github.com/mjackson/d54b40a094277b7afdd6b81f51a0393f
问题
Switch
除了Route
和Redirect
组件之外,不会处理其他任何渲染。如果您想要像这样“嵌套”,那么您需要将每个组件包装在通用路由中,但这是完全不必要的。您的登录组件还没有处理重定向回原来访问的“主页”或私有路由。
解决方案
react-router-dom
v6在版本6中,自定义路由组件已经不再受欢迎,首选方法是使用auth布局组件。
...
或者
...
react-router-dom
v5创建一个消费您的auth上下文的
PrivateRoute
组件。更新您的
Login
组件以处理重定向回原来访问的路由。将所有路由渲染为“扁平列表”