You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何阻止Remix在URL后追加?index参数?

解决Remix表单提交后URL添加?index的问题

问题原因

当表单未显式指定action属性时,Remix会默认将表单提交到当前路由的index action,这就导致URL自动追加?index参数。

解决方案

方案1:显式指定表单的action属性

给点赞表单明确设置action为当前页面的路由路径,提交后URL会保持原路径,不会追加?index。

示例代码:

// houses页面组件
export default function Houses() {
  const houses = useLoaderData<typeof loader>();
  return (
    <div>
      {houses.map((house) => (
        <div key={house.id}>
          <h3>{house.name}</h3>
          <form method="post" action="/houses">
            <input type="hidden" name="houseId" value={house.id} />
            <button type="submit">👍 点赞</button>
          </form>
        </div>
      ))}
    </div>
  );
}

// 对应的action处理函数
export async function action({ request }) {
  const formData = await request.formData();
  const houseId = formData.get("houseId");
  // 执行数据库点赞逻辑
  await likeHouse(houseId);
  // 重定向回原页面,确保状态更新
  return redirect("/houses");
}

方案2:使用useFetcher实现无刷新提交

如果不想页面刷新,推荐用Remix的useFetcher钩子,通过AJAX方式提交表单,完全不会修改URL,交互体验更流畅。

示例代码:

import { useFetcher } from "@remix-run/react";

export default function Houses() {
  const houses = useLoaderData<typeof loader>();
  const fetcher = useFetcher();

  return (
    <div>
      {houses.map((house) => {
        // 判断当前是否正在提交该房屋的点赞请求
        const isLiking = fetcher.state === "loading" && fetcher.formData?.get("houseId") === house.id;
        return (
          <div key={house.id}>
            <h3>{house.name}</h3>
            <fetcher.Form method="post" action="/houses">
              <input type="hidden" name="houseId" value={house.id} />
              <button type="submit" disabled={isLiking}>
                {isLiking ? "点赞中..." : "👍 点赞"}
              </button>
            </fetcher.Form>
          </div>
        );
      })}
    </div>
  );
}

// action处理函数
export async function action({ request }) {
  const formData = await request.formData();
  const houseId = formData.get("houseId");
  await likeHouse(houseId);
  // 返回空响应,无需页面跳转
  return new Response(null, { status: 204 });
}

注意事项

  • 方案1中,action处理完成后需用redirect返回原页面,保证页面数据同步更新。
  • 方案2中,fetcher.Form不会触发页面跳转,还能通过fetcher.state处理加载状态,进一步优化用户体验。

内容的提问来源于stack exchange,提问作者irl_irl

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 11:01:30