What I'm about to do maybe useless. If the community has anyother solutions please present it to me

我所做的是,如果用户有权访问每条路由,我需要判断它.所以我要做的是,如果用户没有访问路径/页面的权限--通信重定向到仪表板

用户权限定义为数字,您可以在下面的代码中看到

element: <Register requiredPermissions={[2, 3]} />

完整的代码

// import AuthRequired from "@/AuthRequired"
import Dashboard from "@/pages/Admin/Dashboard/Dashboard";
import Login from "@/pages/Admin/Login/Login";
import Home from "@/pages/Home/Home";

import { createBrowserRouter } from "react-router-dom";
import AuthRequired from "./AuthRequired";
import Register from "@/pages/Admin/Register/Register";

export const router = createBrowserRouter([
  {
    path: "/",
    element: <Home />,
  },
  {
    path: "/admin/login",
    element: <Login />,
  },
  {
    element: <AuthRequired requiredPermissions={[]} />,
    children: [
      {
        path: "admin/dashboard",
        element: <Dashboard />,
      },
      {
        path: "admin/dashboard/register",
        element: <Register requiredPermissions={[2, 3]} />,
      },
    ],
  },
]);

我需要的是我需要一些如何将props [2,3]传递给AuthRequired.tsx

/* eslint-disable @typescript-eslint/no-explicit-any */
import { Navigate, Outlet, useLocation } from "react-router-dom";
import { store } from "@/store/store";

interface RequiredPermissionsProps {
  requiredPermissions?: number[]; // Optional array of required permissions
}

function AuthRequired({ requiredPermissions = [] }: RequiredPermissionsProps) {
  const _location = useLocation();

  const {
    auth: { token, user, permissions },
  } = store.getState();

  console.log("requiredPermissions ->", requiredPermissions);

  return (
    <>
      {token && user && permissions && permissions !== "" ? (
        <Outlet />
      ) : (
        <Navigate to="/admin/login" state={{ from: _location }} replace />
      )}
    </>
  );
}

export default AuthRequired;

因此,在AuthRequired.tsx中,我可以判断条件并输出或重定向

你有什么解决办法吗,或者我还有别的办法吗

推荐答案

假设您需要将state.auth.permissions与传递的requiredPermissionsprops 进行比较,我建议对AuthRequired进行以下重构.

function AuthRequired({ requiredPermissions = [] }: RequiredPermissionsProps) {
  const location = useLocation();

  const { token, user, permissions } = useSelector(state => state.auth);

  console.log({ requiredPermissions });

  const hasPermission = requiredPermissions.length
    ? requiredPermissions.every(
      permission => permissions.includes(permission)
    ) : true;

  const hasAccess = token && user && hasPermission;

  return hasAccess
    ? <Outlet />
    : <Navigate to="/admin/login" state={{ from: location }} replace />;
}

重新组织和包装您希望通过权限/角色保护的路由.

示例:

export const router = createBrowserRouter([
  { path: "/", element: <Home /> },
  {
    path: "admin",
    children: [
      { path: "login", element: <Login /> },
      {
        path: "dashboard",
        children: [
          { index: true, element: <Dashboard /> },
          ... any other unprotected admin dashboard routes
          {
            element: <AuthRequired requiredPermissions={[2, 3]} />,
            children: [
              { path: "register", element: <Register /> },
              ... any other protected admin dashboard routes
            ],
          },
        ],
      },
    ],
  },
]);

Reactjs相关问答推荐

如何使用react-router-dom导航到网页中的其他路由?

包装组件可以避免子组件重新渲染.?

将动态元素中的输入数据传输到Reaction

导致useState中断的中断模式

是否在Extra Reducer完成作业(job)时触发createListenerMiddleware?

Google Firestore无法读取图像-react

在新屏幕上显示照片时出现问题-react

如何使ionic 面包屑在州政府条件下可点击?

如何在我的 React 应用程序中仅显示我的 Register 组件

如何更改TimePicker中下拉菜单的背景 colored颜色 和字体 colored颜色 - MUI React

解决在React测试库中的act()警告

如何渲染子路径并触发react 路由父加载器?

React 测试库包装器组件

如何防止开发人员使用 ESLint 在 React 项目中使用特定的钩子?

刷新页面时状态改变问题

使用输入类型文本对 useState 和日期做出react

setState 改变对象引用

为什么我在此代码段中看不到 useEffect for count = 1?

在 redux 状态更改时更新react 按钮禁用状态

如何在 NavBar 中设置动态标题