当你在 Remix 中使用 <Form method="post">
时,而不是使用原生的 HTML <form method="post">
,Remix 不会遵循在导航事件(如点击后退、前进或刷新)期间重新提交表单的默认浏览器行为。
在标准浏览器环境中,表单提交是导航事件。这意味着当用户点击后退按钮时,浏览器通常会重新提交表单。例如
/buy
/checkout
/order/123
浏览器历史堆栈将如下所示
GET /buy > POST /checkout > *GET /order/123
如果用户点击后退按钮,历史记录将变为
GET /buy - *POST /checkout < GET /order/123
在这种情况下,浏览器会重新提交表单数据,这可能会导致诸如重复收取信用卡费用等问题。
action
重定向避免此问题的一种常见做法是在 POST 请求后发出重定向。这将从浏览器的历史记录中删除 POST 操作。历史堆栈将如下所示
GET /buy > POST /checkout, Redirect > GET /order/123
使用这种方法,点击后退按钮不会重新提交表单
GET /buy - *GET /order/123
虽然在 Remix 中通常不会发生意外的重新提交,但在某些特定场景下可能会发生。
<form>
而不是 <Form>
<Form reloadDocument>
<Scripts/>
建议从操作中实现重定向,以避免意外的重复提交。
指南
API