b2b电商系统搭建的关键步骤与最佳实践解析,助力企业数字化转型
1084
2022-05-30
React Router v6是React应用程序的一个流行且功能强大的路由库。它提供了一种声明式的、基于组件的路由方法,并能处理URL参数、重定向和加载数据等常见任务。
这个最新版本的React Router引入了很多新概念,比如
本文将演示如何使用React Router v6创建受保护的路由以及如何添加身份验证。
开始
打开终端,运行以下命令创建一个新的 React 项目:
> npx create-react-app ReactRouterAuthDemo > cd ReactRouterAuthDemo
接下来,在 React 应用程序中安装 React Router 作为依赖项:
> npm install react-router-dom
一旦 React Router 依赖项安装好,我们就可以开始编辑src/index.js文件。
首先,从 react-router-dom 中导入 BrowserRouter组件,然后用
import { StrictMode } from "react"; import { createRoot } from "react-dom/client"; import { BrowserRouter } from "react-router-dom"; import App from "./App"; const rootElement = document.getElementById("root"); const root = createRoot(rootElement); root.render(
基础路由
React Router提供了
import { Routes, Route } from "react-router-dom"; import { LoginPage } from "./pages/Login"; import { HomePage } from "./pages/Home"; import "./styles.css"; export default function App() { return (
我们可以通过创建Login.jsx和Home.jsx来使用
// Login.jsx export const LoginPage = () => (
接下来,我们将运行下面的命令来启动应用程序:
> npm run start
在浏览器中,我们默认会看到Home组件。如果我们使用/login路由,我们将看到LoginPage组件呈现在屏幕上。
或者,我们也可以使用一个普通的JavaScript对象,通过useRoutes钩子来表示应用程序中的路由。这是一种定义路由的功能方法,其工作方式与< routes />和
import { useRoutes } from "react-router-dom"; // ... export default function App() { const routes = useRoutes([ { path: "/", element:
既然基本设置已经完成,让我们看看如何创建受保护的路由,从而使未经身份验证的用户无法访问应用程序中的某些内容。
创建受保护的路由
在创建受保护的路由之前,让我们先创建一个自定义钩子,它将使用Context API和useContext钩子处理通过身份验证的用户的状态。
import { createContext, useContext, useMemo } from "react"; import { useNavigate } from "react-router-dom"; import { useLocalStorage } from "./useLocalStorage"; const AuthContext = createContext(); export const AuthProvider = ({ children }) => { const [user, setUser] = useLocalStorage("user", null); const navigate = useNavigate(); // 验证用户权限的时候,访问该函数 const login = async (data) => { setUser(data); navigate("/profile"); }; // 登出 const logout = () => { setUser(null); navigate("/", { replace: true }); }; const value = useMemo( () => ({ user, login, logout }), [user] ); return
上述 useAuth 钩子中,我们暴露了用户的状态和一些用于用户登录和注销的方法。当用户登出时,我们使用 React Router 的 useNavigate 钩子将他们重定向到主页。
为了在页面刷新时保持用户的状态,我们将使用 useLocalStorage 钩子,它将在浏览器的本地存储中同步状态值。
import { useState } from "react"; export const useLocalStorage = (keyName, defaultValue) => { const [storedValue, setStoredValue] = useState(() => { try { const value = window.localStorage.getItem(keyName); if (value) { return JSON.parse(value); } else { window.localStorage.setItem(keyName, JSON.stringify(defaultValue)); return defaultValue; } } catch (err) { return defaultValue; } }); const setValue = (newValue) => { try { window.localStorage.setItem(keyName, JSON.stringify(newValue)); } catch (err) {} setStoredValue(newValue); }; return [storedValue, setValue]; };
import { Navigate } from "react-router-dom"; import { useAuth } from "../hooks/useAuth"; export const ProtectedRoute = ({ children }) => { const { user } = useAuth(); if (!user) { // user is not authenticated return
要重定向用户,我们使用
在 App.js 文件中,我们可以用
import { Routes, Route } from "react-router-dom"; import { LoginPage } from "./pages/Login"; import { HomePage } from "./pages/Home"; import { SignUpPage } from "./pages/SignUp"; import { ProfilePage } from "./pages/Profile"; import { SettingsPage } from "./pages/Settings"; import { ProtectedRoute } from "./components/ProtectedRoute"; export default function App() { return (
如果受保护的路由数量有限,上面的方法工作得很好,但如果有多个这样的路由,我们就必须把每个都包装起来,这很繁琐。
相反,我们可以使用React Router v6的嵌套路由特性,将所有受保护的路由封装在一个布局中。
使用嵌套路由和< Outlet />
React Router v6中最强大的特性之一是嵌套路由。这个特性允许我们有一个包含其他子路由的路由。我们的大多数布局都与URL上的片段相耦合,React Router完全支持这一点。
例如,我们可以在
import { ProtectedLayout } from "./components/ProtectedLayout"; import { HomeLayout } from "./components/HomeLayout"; // ... export default function App() { return (
父组件
当用户导航到 /dashboard/profile 时,路由器将呈现
父路由元素还可以具有额外的公共业务逻辑和用户界面。例如,在
import { Navigate, Outlet } from "react-router-dom"; import { useAuth } from "../hooks/useAuth"; export const ProtectedLayout = () => { const { user } = useAuth(); if (!user) { return
除了
import { Link, Navigate, useOutlet } from "react-router-dom"; // ... export const ProtectedLayout = () => { const { user } = useAuth(); const outlet = useOutlet(); if (!user) { return
与受保护路由类似,我们不希望通过身份验证的用户访问 /login 路径。让我们在
import { Navigate, Outlet } from "react-router-dom"; import { useAuth } from "../hooks/useAuth"; export const HomeLayout = () => { const { user } = useAuth(); if (user) { return
结尾
值得花一些时间来更好地理解 React Router v6 的工作原理,特别是用户身份验证。
与以前的版本相比,React Router v6是一个巨大的改进。它快速、稳定、可靠。除了更容易使用之外,它还有很多新特性,比如
我希望本指南对您有所帮助,希望您对如何使用React Router v6处理用户身份验证有了更好的理解。
React
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。