我正在try 在Reaction中构建一条私有和公共的路径,并且我正在使用useRoutes钩子.我不知道该怎么做,在堆栈溢出上已经有了这个问题的答案.然而,这只是一些代码的复制和粘贴.我真的很想知道我是怎么买得起这个的.

我试着用另一个答案,但它对我没有多大帮助.如果有人能帮忙,我将不胜感激.这是我写的代码.

import Home from "../pages/home"
import Items from "../pages/itens"
import Login from "../pages/login"
import Printers from "../pages/printers"
import { AuthContext } from "../contexts"
import { useContext } from "react"
import { Navigate } from "react-router-dom"

function Routes() {

    const { sessionContextValue } = useContext(AuthContext)
    const { isAuth } = sessionContextValue

    const routes = [
        {
            path: '/',
            element: isAuth ? <Home /> : <Navigate to={'/login'} replace/>,
        },
        {
            path: '/printers',
            element: <Printers />
        },
        {
            path: '/items',
            element: <Items />
        },
        {
            path: '/login',
            element: <Login />
        }
    ]

    let router = useRoutes(routes)
    return router
}

export default Routes

推荐答案

要使用useRoutes挂钩创建私有和公共路由,您可以使用一个定制组件来判断用户的身份验证状态,并呈现适当的元素或重定向到登录页面.例如,您可以创建一个PrivateRoute组件,如下所示:

import { Navigate, useLocation } from "react-router-dom";
import { useContext } from "react";
import { AuthContext } from "../contexts";

export default function PrivateRoute({ element }) {
  const { sessionContextValue } = useContext(AuthContext);
  const { isAuth } = sessionContextValue;
  const location = useLocation();

  return isAuth ? (
    element
  ) : (
    <Navigate to="/login" state={{ from: location }} replace />
  );
}

然后,您可以在路由数组中使用此组件,如下所示:

import Home from "../pages/home";
import Items from "../pages/items";
import Login from "../pages/login";
import Printers from "../pages/printers";
import { useRoutes } from "react-router-dom";
import PrivateRoute from "./PrivateRoute";

function Routes() {
  const routes = [
    {
      path: "/",
      element: <PrivateRoute element={<Home />} />,
    },
    {
      path: "/printers",
      element: <PrivateRoute element={<Printers />} />,
    },
    {
      path: "/items",
      element: <PrivateRoute element={<Items />} />,
    },
    {
      path: "/login",
      element: <Login />,
    },
  ];

  let router = useRoutes(routes);
  return router;
}

export default Routes;

Javascript相关问答推荐

不渲染具有HTML参数的React元素

有Angular 的material .未应用收件箱中的价值变化

vanillajs-datepicker未设置输入值,日期单击时未触发更改事件

过滤对象数组并动态将属性放入新数组

如何找出摆线表面上y与x相交的地方?

为什么我的列表直到下一次提交才更新值/onChange

Chromium会将URL与JS一起传递到V8吗?

如何使onPaste事件与可拖动的HTML元素一起工作?

如果Arrow函数返回函数,而不是为useEffect返回NULL,则会出现错误

Reaction Native中的范围滑块

Next.js服务器端组件请求,如何发送我的cookie token?

将异步回调转换为异步生成器模式

触发异步函数后不能显示数据

如何防止ionic 输入中的特殊字符.?

JS Animate()方法未按预期工作

FireBase云函数-函数外部的ENV变量

JavaScript:如果字符串不是A或B,则

React Refs不与高阶组件(HOC)中的动态生成组件一起工作

每隔3个项目交替显示,然后每1个项目交替显示

Promise.race()返回已解析的promise ,而不是第一个被拒绝的promise