我目前正在研究React-Router,并设置了如下路由 struct :

const router = createBrowserRouter([    
  {
    path: "/",
    loader: rootLayoutLoader,
    element: <RootLayout />,
    children: [
      {
        path: "student",
        loader: commonPageLoader,
        element: <Student />,
      },
      {
        path: "teacher",
        loader: commonPageLoader,
        element: <Teacher />,
      },
    ],
  },
]);

在我的设置中,rootLayoutLoader函数负责调用API来收集TeacherStudent组件使用的一些常见信息.同时,commonPageLoader函数正在根据位置路径调用API来获取特定数据.

现在,这是我遇到的问题:当我在"/teacher"路由中单击"Teacher"链接时,它会触发rootLayoutLoadercommonPageLoader功能.如何防止这种双重加载行为,同时仍然确保适当获取必要的数据?

推荐答案

这就是路由加载器的工作方式,他们将在某些情况下重新验证其数据,以保持数据与路由同步.

在几种情况下,数据会被重新验证,从而自动保持您的UI与数据同步:

  • <Form>调用操作后.
  • <fetcher.Form>调用操作后
  • useSubmit调用操作后
  • fetcher.submit调用操作后
  • 当通过useRevalidator触发显式重新验证时
  • 当已渲染的路由的URL参数更改时
  • 当URL搜索参数更改时
  • 100

当您已经在"/teacher"路径上时,单击"/teacher"链接时,将触发最后一个点.

您可以在路由上实现shouldRevalidateprops ,以便当URL路径相同时它不会重新验证.

基本示例:

const shouldRevalidate = ({ currentUrl, nextUrl }) => {
  return currentUrl.pathname !== nextUrl.pathname;
};

const router = createBrowserRouter([    
  {
    path: "/",
    loader: rootLayoutLoader,
    element: <RootLayout />,
    children: [
      {
        path: "student",
        loader: commonPageLoader,
        shouldRevalidate,
        element: <Student />,
      },
      {
        path: "teacher",
        loader: commonPageLoader,
        shouldRevalidate,
        element: <Teacher />,
      },
    ],
  },
]);

Javascript相关问答推荐

使用JavaScript重命名对象数组中的键

如何按预期聚合SON数据?

如何访问react路由v6加载器函数中的查询参数/搜索参数

有条件的悲剧

每次子路由重定向都会调用父加载器函数

了解Node.js中的EventEums和浏览器中的addEventEums之间的关系

防止用户在selectizeInput中取消 Select 选项

从WooCommerce Checkout Country字段重新排序国家,保持国家同步

在Vite React库中添加子模块路径

WebGL 2.0无符号整数输入变量

获取Uint8ClampedArray中像素数组的宽度/高度

用于在路径之间移动图像的查询

如何将未排序的元素追加到数组的末尾?

确保函数签名中的类型安全:匹配值

变量在导入到Vite中的另一个js文件时成为常量.

基于产品ID更新条带产品图像的JavaScript命中错误

无法检索与Puppeteer的蒸汽游戏的Bundle 包价格

在渲染turbo流之后滚动到元素

在HTML5画布上下文中使用putImageData时,重载解析失败

如何调整下拉内容,使其不与其他元素重叠?