我有以下设置:

App.js

import AppContext from './context/AppContext.js';
import router from './routes/routes.js';

function App() {
    const [token, setToken] = useState("");
    
    function login(token) {
        setToken(token);
    }

    return (
        <React.StrictMode>
            <AppContext.Provider value={{ token, login }}>
                <RouterProvider router={router} />
            </AppContext.Provider>
        </React.StrictMode>
    );
}

export default App;

routes.js

export default createBrowserRouter([
    {
        path: "/",
        element: <Root />,
        children: [
            {
                path: "home",
                element: <Home />
            },
            {
                path: "admin",
                element: <ProtectedRoute element={Admin} />
            },
            {
                path: "login",
                element: <Login />
            }
        ]
    }
]);

ProtectedRoute.js

export default function ProtectedRoute({ element: Component, ...rest }) {
    const ctx = useContext(AppContext);

    return (
        ctx.token !== "" ? <Component /> : <Navigate to="/login" />
    );
}

我希望能够通过从上下文访问信息来判断用户是否登录,但是返回的对象始终包含缺省值.在这种情况下,有没有办法使用createBrowserRouter来访问上下文信息?

推荐答案

受保护的路由组件应该被重构,通过呈现Outlet而不是some通过props 来呈现为布局路由组件.

import { Navigate, Outlet } from 'react-router-dom';

export default function ProtectedRoute() {
  const { token } = useContext(AppContext);

  return token
    ? <Outlet />
    : <Navigate to="/login" replace />;
}
export default createBrowserRouter([
  {
    path: "/",
    element: <Root />,
    children: [
      { path: "home", element: <Home /> },
      {
        element: <ProtectedRoute />,
        children: [
          {
            path: "admin",
            element: <Admin />
          },
          // ... other protected routes
        ],
      },
      { path: "login", element: <Login /> }
      // ... other unprotected routes
    ]
  }
]);

Javascript相关问答推荐

创建私有JS出口

如何从对象嵌套数组的第二级对象中过滤出键

容器如何更改默认插槽中子项的显示?

如何分配类型脚本中具有不同/额外参数的函数类型

GrapeJS -如何保存和加载自定义页面

如何从JSON数组添加Google Maps标记—或者如何为数组添加参数到标记构造器

使搜索栏更改语言

google docs boldText直到按行执行应用脚本错误

当试图显示小部件时,使用者会出现JavaScript错误.

制作钢琴模拟器,并且在控制台中不会执行或显示该脚本

JS:XML insertBefore插入元素

如何使用JavaScript拆分带空格的单词

try 使用PM2在AWS ubuntu服务器上运行 node 进程时出错

以编程方式聚焦的链接将被聚焦,但样式不适用

如何使用基于promise (非事件emits 器)的方法来传输数据?

如何在和IF语句中使用||和&;&;?

在不扭曲纹理的情况下在顶点着色器中旋转UV

ComponentWillReceiveProps仍在React 18.2.0中工作

通过ng-绑定-html使用插入的HTML中的函数

递归地将JSON对象的内容上移一级