主分支
分支
主分支 (6.23.1)开发分支
版本
6.23.1v4/5.xv3.x
索引查询参数

索引查询参数

您可能会发现一个奇怪的 ?index 出现在您提交表单时应用程序的 URL 中。

由于嵌套路由的存在,您的路由层次结构中的多个路由可能与 URL 匹配。与导航不同,导航会调用所有匹配的路由加载器来构建 UI,当提交表单时,只调用一个操作

由于索引路由与它们的父路由共享相同的 URL,因此 ?index 参数允许您区分两者。

例如,考虑以下路由器和表单

createBrowserRouter([
  {
    path: "/projects",
    element: <ProjectsLayout />,
    action: ProjectsLayout.action,
    children: [
      {
        index: true,
        element: <ProjectsIndex />,
        action: ProjectsPage.action,
      },
    ],
  },
]);

<Form method="post" action="/projects" />;
<Form method="post" action="/projects?index" />;

?index 参数将提交到索引路由,没有索引参数的操作将提交到父路由。

<Form> 在没有 action 的索引路由中渲染时,?index 参数将自动附加,以便表单发布到索引路由。以下表单在提交时将发布到 /projects?index,因为它是在项目索引路由的上下文中渲染的

function ProjectsIndex() {
  return <Form method="post" />;
}

如果您将代码移到 ProjectsLayout 路由,它将改为发布到 /projects

这适用于 <Form> 及其所有同类

let submit = useSubmit();
submit({}, { action: "/projects" });
submit({}, { action: "/projects?index" });

let fetcher = useFetcher();
fetcher.submit({}, { action: "/projects" });
fetcher.submit({}, { action: "/projects?index" });
<fetcher.Form action="/projects" />;
<fetcher.Form action="/projects?index" />;
<fetcher.Form />; // defaults to the route in context