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