Création d'itinéraires protégés : un guide pratique utilisant React-Router-dom
P粉596191963
2023-08-24 11:22:28
<p>Comment utiliser <code>react-router-dom</code> pour créer une route protégée et stocker la réponse dans localStorage afin que l'utilisateur puisse consulter à nouveau ses détails la prochaine fois qu'il l'ouvrira. Une fois connectés, ils doivent être redirigés vers la page du tableau de bord. </p>
<p>Toutes les fonctions sont ajoutées dans ContextApi.Codesandbox链接:Code</p>
<p>我尝试过,但无法实现</p>
<p>路由页面</p>
<pre class="brush:php;toolbar:false;">importer React, { useContext } depuis "react" ;
importer { globalC } depuis "./context" ;
importer {Route, Switch, BrowserRouter } depuis "react-router-dom" ;
importer À propos de "./À propos" ;
importer le tableau de bord depuis "./Dashboard" ;
importer la connexion depuis "./Login" ;
importer PageNotFound depuis "./PageNotFound" ;
fonction Routes() {
const { authLogin } = useContext(globalC);
console.log("authLogin", authLogin);
retour (
<NavigateurRouter>
<Commutateur>
{authConnexion ? (
≪>
<Route path="/dashboard" composant={Dashboard} exact />
<Route exact path="/À propos" composant={À propos} />
≪/>
) : (
<Route path="/" composant={Connexion} exact />
)}
<Composant d'itinéraire={PageNotFound} />
</Commutateur>
</NavigateurRouter>
);
}
exporter les itinéraires par défaut ;</pre>
<p>上下文页面</p>
<pre class="brush:php;toolbar:false;">importer React, { Component, createContext } depuis "react" ;
importer des axios depuis "axios" ;
export const globalC = createContext();
la classe d'exportation Gprov étend le composant {
état = {
connexion auth : null,
authLoginerror : null
} ;
composantDidMount() {
var localData = JSON.parse(localStorage.getItem("loginDetail"));
si (donnéeslocales) {
this.setState({
connexion auth : localData
});
}
}
loginData = async () => {
laissez la charge utile = {
jeton : "ctz43XoULrgv_0p1pvq7tA",
données: {
nom : "nomPremier",
email : "internetEmail",
téléphone : "téléphoneAccueil",
_répétition : 300
}
} ;
attendre axios
.post(`https://app.fakejson.com/q`, charge utile)
.then((res) => {
si (res.status === 200) {
this.setState({
connexion auth : res.data
});
localStorage.setItem("loginDetail", JSON.stringify(res.data));
}
})
.catch((err) =>
this.setState({
authLoginerror : erreur
})
);
} ;
rendre() {
// console.log(localStorage.getItem("loginDetail"));
retour (
<globalC.Provider
valeur={{
...cet.état,
données de connexion : this.loginData
}}
>
{this.props.enfants}
</globalC.Provider>
);
}
}≪/pré>
<p><br /></p>
Pour la v6 :
Lien du document : https://gist.github.com/mjackson/d54b40a094277b7afdd6b81f51a0393f
Question
Switch
除了Route
和Redirect
Aucun autre rendu ne sera traité en dehors du composant. Si vous vouliez « imbriquer » comme ceci, vous devrez alors envelopper chaque composant dans une route générique, mais cela est totalement inutile.Votre composant de connexion ne gère pas encore la redirection vers le « domicile » ou l'itinéraire privé d'origine visité.
Solution
react-router-dom
v6Dans la version 6, les composants de routage personnalisés ne sont plus populaires, la méthode préférée consiste à utiliser des composants de mise en page d'authentification.
...
ou
...
react-router-dom
v5Créez un composant
PrivateRoute
qui consomme votre contexte d'authentification.Mettez à jour votre composant
Login
pour gérer les redirections de routage vers la visite d'origine.Rendez tous les itinéraires sous forme de "liste plate"