Panduan untuk mencipta laluan yang dilindungi: Melaksanakan penghalaan yang dilindungi menggunakan react-router-dom
P粉011684326
2023-08-23 10:07:33
<p>Cara menggunakan <code>react-router-dom</code> untuk mencipta laluan yang dilindungi dan menyimpan respons dalam localStorage supaya pengguna boleh melihat butiran mereka semula pada kali seterusnya mereka membukanya. Selepas log masuk, mereka harus diubah hala ke halaman papan pemuka. </p>
<p>Semua fungsi ditambah dalam ContextApi. </p>
<p>Pautan kotak kod: Kod</p>
<p>Saya cuba tetapi tidak berjaya.</p>
<p>路由页面</p>
<pre class="brush:php;toolbar:false;">import React, { useContext } daripada "react";
import { globalC } daripada "./context";
import { Route, Switch, BrowserRouter } daripada "react-router-dom";
import Perihal daripada "./Perihal";
import Papan Pemuka daripada "./Papan Pemuka";
import Log Masuk daripada "./Login";
import PageNotFound daripada "./PageNotFound";
fungsi Laluan() {
const { authLogin } = useContext(globalC);
console.log("authLogin", authLogin);
kembali (
<Penghala Penyemak Imbas>
<Tukar>
{authLogin ? (
<>
<Route path="/dashboard" component={Dashboard} tepat />
<Route exact path="/About" component={About} />
</>
) : (
<Route path="/" component={Login} tepat />
)}
<Komponen laluan={PageNotFound} />
</Tukar>
</BrowserRouter>
);
}
eksport Laluan lalai;</pre>
<p>上下文页面</p>
<pre class="brush:php;toolbar:false;">import React, { Component, createContext } daripada "react";
import axios daripada "axios";
eksport const globalC = createContext();
kelas eksport Gprov memanjangkan Komponen {
negeri = {
authLogin: null,
authLoginerror: null
};
componentDidMount() {
var localData = JSON.parse(localStorage.getItem("loginDetail"));
if (localData) {
this.setState({
authLogin: localData
});
}
}
loginData = tak segerak () => {
biarkan muatan = {
token: "ctz43XoULrgv_0p1pvq7tA",
data: {
nama: "nama pertama",
e-mel: "internetEmail",
telefon: "phoneHome",
_ulang: 300
}
};
tunggu aksios
.post(`https://app.fakejson.com/q`, muatan)
.then((res) => {
jika (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"));
kembali (
<globalC.Pembekal
nilai={{
... negeri ini,
loginData: this.loginData
}}
>
{this.props.children}
</globalC.Provider>
);
}
}</pre>
<p><br /></p>
Untuk v6:
Pautan ke dokumentasi: https://gist.github.com/mjackson/d54b40a094277b7afdd6b81f51a0393f
Soalan
Switch
除了Route
和Redirect
Tidak mengendalikan sebarang pemaparan lain di luar komponen. Jika anda ingin "bersarang" seperti ini, maka anda perlu membungkus setiap komponen dalam laluan generik, tetapi ini sama sekali tidak perlu.Komponen log masuk anda juga tidak mengendalikan ubah hala kembali ke "rumah" atau laluan peribadi lawatan asal.
Penyelesaian
react-router-dom
v6Dalam versi 6, komponen penghalaan tersuai tidak lagi popular, kaedah pilihan adalah menggunakan komponen reka letak auth.
...
atau
...
react-router-dom
v5Buat komponen
PrivateRoute
yang menggunakan konteks pengesahan anda.Kemas kini komponen
Login
anda untuk mengendalikan pengalihan semula ke lawatan asal.Menjadikan semua laluan sebagai "senarai rata"