Comment utiliser react-router-dom
Créez une route protégée et stockez la réponse dans localStorage afin que l'utilisateur puisse revoir ses détails la prochaine fois qu'il l'ouvrira. Après vous être connecté, vous devriez être redirigé vers la page du tableau de bord.
Toutes les fonctions sont ajoutées dans ContextApi.
Lien Codesandbox : Code
J'ai essayé mais je n'ai pas réussi à y arriver.
Page de routage
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;
Page contextuelle
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> ); } }
Pour la v6 :
Lien vers la documentation : https://gist.github.com/mjackson/d54b40a094277b7afdd6b81f51a0393f
Question
Switch
不处理除Route
和Redirect
Tout rendu en dehors du composant. Si vous vouliez « imbriquer » comme ceci, vous devrez alors envelopper chaque composant dans un itinéraire commun, mais cela est totalement inutile.Votre composant de connexion ne gère pas non plus 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 recommandée est d'utiliser le composant 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.Rendre tous les itinéraires dans une "liste plate"