react-router-dom v6中loader和路由守卫

        react-router-dom v6中新增了几个属性,这里主要记录下loader。

        loader只在数据路由中生效。

支持新API的数据路由:

以下路由不支持数据 API:

        一般项目中使用createBrowserRouter创建路由。

loader使用
createBrowserRouter([
  {
    path: "/teams/:teamId",
    loader: ({ params }) => {
      return fakeGetTeam(params.teamId);
    },
  },
]);

        loader函数会在路由加载前执行,相当于路由前置守卫。params为动态路由中传递的teamId参数对象,可以在loader中使用该对象调用接口,获取参数并return出去。

        loader函数return的值可以在该页面中使用useRouteLoaderData获取。

        但是不推荐这种写法,受接口响应速度影响,可能会造成跳转后白屏的情况。在react中,完全可以在useEffect中执行数据获取,搭配加载中动画可以较好的处理数据请求时的过渡,比直接在loader中请求数据好得多。

loader应用

        可以在loader中获取redux中的各类数据,token或者auth等,判断用户是否有资格跳转某个页面,如果没有,使用redirect跳到无权限页面,或者首页/登录页。

      {
        path: "page2/:id",
        element: PageLoading(<Page2 />),
        title: "Page2",
        icon: <SnippetsFilled />,
        auth: false,
        loader:()=>{
          let token = store.getState().user.token
          if(!token) return redirect("/home");
          return {a:123}
        }
      }

        可以基于这种用法实现前置路由守卫能力。

路由守卫另一种实现

另一种实现是以高级组件的形式实现,但是实现原理和loader是一致的。

function ContainerCom({comp}:{comp:ReactElement}){
  //具体逻辑不仅限于token判断,可以按需编辑
  const token = useAppSelector(store=>store.user.token)
  return (
    token?comp:<ErrorPage/>
  )
}

const routerObj: RouteType[] = [
  {
    path: "/",
    element: <App />,
    errorElement: <ErrorPage />,
    children: [
      {
        // path: "/",
        index:true,
        element: ContainerCom({comp:<Page1 />}),
        title: "page1",
        icon: <GoldFilled />,
        auth: false
      }
    ],
  }
];

关于routerObj的类型声明可以看我另一篇关于v6中自定义路由meta信息的文章:

react-router-dom6路由表中添加meta/自定义信息_react router 如何在路由上添加额外数据-CSDN博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值