您可能会发现一个奇怪的 ?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