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

React Router 6中如何向loader传参并让组件获取返回数据?

解决方法:闭包传递参数 + 正确绑定loader

你遇到的核心问题是之前的loader绑定方式有误——如果直接把loaderHome(filmsPerPage)赋值给loader,相当于立刻执行了loader函数,把返回值(比如Promise)传给了路由的loader属性,但React Router需要的是一个函数,这才导致useLoaderData返回null。

下面是两种靠谱的解决方式:

方式一:闭包封装loader(最直接)

把filmsPerPage定义在loader外层,利用JS闭包让loader函数直接访问到这个变量,同时直接把这个loader函数绑定给路由的loader属性:

// 仅定义一次的变量
const filmsPerPage = 10;

// 闭包访问filmsPerPage的loader函数
const homeLoader = () => {
  // 直接使用外层的filmsPerPage参数
  return fetch(`/api/films?limit=${filmsPerPage}`)
    .then(res => res.json())
    .catch(err => console.error(err));
};

// 路由配置
const router = createBrowserRouter([
  {
    path: "/",
    // 给Home组件传递props
    element: <Home filmsPerPage={filmsPerPage} />,
    // 直接绑定loader函数,由React Router自动调用
    loader: homeLoader,
  },
]);

这样操作后:

  • loader能正常拿到filmsPerPage参数发起请求
  • Home组件通过props接收filmsPerPage
  • useLoaderData()能正确获取loader返回的数据

方式二:路由配置存额外参数

如果需要把参数和路由配置绑定,可以在路由里加extra字段,然后在loader里通过context获取:

const filmsPerPage = 10;

const homeLoader = ({ context }) => {
  // 从路由配置的extra中取出参数
  const pageSize = context.router.route.extra.filmsPerPage;
  return fetch(`/api/films?limit=${pageSize}`)
    .then(res => res.json());
};

const router = createBrowserRouter([
  {
    path: "/",
    element: <Home filmsPerPage={filmsPerPage} />,
    loader: homeLoader,
    // 将参数存入路由配置的extra属性
    extra: { filmsPerPage },
  },
]);

这种方式适合参数需要和路由强关联的场景,灵活性也不错。

关键提醒:永远不要直接执行loader函数后赋值给路由的loader属性,必须传递函数本身,让React Router在合适时机调用它,这样useLoaderData才能正常工作。

内容的提问来源于stack exchange,提问作者D. Rattansingh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 01:22:17