当提交表单时,您可能会发现应用程序的 URL 中出现了一个 ?index
。
由于嵌套路由的存在,路由层次结构中的多个路由可以匹配 URL。与所有匹配路由的 loader
都被调用以构建 UI 的导航不同,当提交 form
时,**只会调用一个 action**。
因为索引路由与它们的父路由共享相同的 URL,所以 ?index
参数允许您区分两者。
例如,考虑以下表单
<Form method="post" action="/projects" />;
<Form method="post" action="/projects?index" />;
?index
参数将提交到索引路由,不带索引参数的 action
将提交到父路由。
当在没有 action
的索引路由中渲染 <Form>
时,?index
参数将自动附加,以便表单发布到索引路由。以下表单在提交时将发布到 /projects?index
,因为它是在 projects 索引路由的上下文中渲染的
function ProjectsIndex() {
return <Form method="post" />;
}
如果您将代码移动到 ProjectsLayout
路由,它将改为发布到 /projects
。
这适用于 <Form>
及其所有同类
function Component() {
const submit = useSubmit();
submit({}, { action: "/projects" });
submit({}, { action: "/projects?index" });
}
function Component() {
const 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
}