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>
、useSubmit
或 fetcher.submit
future.unstable_skipActionErrorRevalidation
标志启用时,如果 action
返回或抛出 4xx/5xx Response
,则默认情况下 loaders
不会重新验证。shouldRevalidate
和 unstable_actionStatus
参数选择加入这些情况下的重新验证。useRevalidator
触发显式重新验证时如果你在路由上定义了shouldRevalidate
,它会在调用路由加载器获取新数据之前先检查该函数。如果函数返回false
,则加载器不会被调用,该加载器的现有数据将保留在页面上。
<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 的数据将始终在初始时被获取。