主分支
分支
主分支 (6.23.1)开发分支
版本
6.23.1v4/5.xv3.x
shouldRevalidate

shouldRevalidate

类型声明
interface ShouldRevalidateFunction {
  (args: ShouldRevalidateFunctionArgs): boolean;
}

interface ShouldRevalidateFunctionArgs {
  currentUrl: URL;
  currentParams: AgnosticDataRouteMatch["params"];
  nextUrl: URL;
  nextParams: AgnosticDataRouteMatch["params"];
  formMethod?: Submission["formMethod"];
  formAction?: Submission["formAction"];
  formEncType?: Submission["formEncType"];
  text?: Submission["text"];
  formData?: Submission["formData"];
  json?: Submission["json"];
  actionResult?: any;
  unstable_actionStatus?: number;
  defaultShouldRevalidate: boolean;
}

此函数允许您选择退出对路由的 loader 的重新验证,作为一种优化。

此功能仅在使用数据路由器时有效,请参阅 选择路由器

在以下几种情况下,数据会重新验证,从而使您的 UI 与您的数据保持同步。

  • 在通过以下方式调用 action 之后
    • <Form><fetcher.Form>useSubmitfetcher.submit
    • future.unstable_skipActionErrorRevalidation 标志启用时,如果 action 返回或抛出 4xx/5xx Response,则默认情况下 loaders 不会重新验证。
    • 您可以通过 shouldRevalidateunstable_actionStatus 参数选择加入这些情况下的重新验证。
  • 当通过 useRevalidator 触发显式重新验证时
  • 当已渲染路由的 URL 参数 发生变化时
  • 当 URL 搜索参数发生变化时
  • 当导航到与当前 URL 相同的 URL 时

如果你在路由上定义了shouldRevalidate,它会在调用路由加载器获取新数据之前先检查该函数。如果函数返回false,则加载器不会被调用,该加载器的现有数据将保留在页面上。

Fetcher 加载也会重新验证,但由于它们加载的是特定 URL,因此不必担心上述 URL 驱动的重新验证场景。Fetcher 加载默认情况下仅在操作提交和显式重新验证请求后重新验证。
<Route
  path="meals-plans"
  element={<MealPlans />}
  loader={loadMealPlans}
  shouldRevalidate={({ currentUrl }) => {
    // only revalidate if the submission originates from
    // the `/meal-plans/new` route.
    return currentUrl.pathname === "/meal-plans/new";
  }}
>
  <Route
    path="new"
    element={<NewMealPlanForm />}
    // `loadMealPlans` will be revalidated after
    // this action...
    action={createMealPlan}
  />
  <Route
    path=":planId/meal"
    element={<Meal />}
    // ...but not this one because origin the URL
    // is not "/meal-plans/new"
    action={updateMeal}
  />
</Route>

请注意,这仅适用于已加载、当前渲染且将在新 URL 上继续渲染的数据。新路由和新 URL 上的 fetchers 的数据将始终在初始时被获取。

使用此 API 会使你的 UI 与数据不同步,请谨慎使用!

文档和示例 CC 4.0