Bootstrap

干货|react router- loader 和组件 useEffect 加载数据的选择

loader 的优点

  1. 集中式数据加载

    • 通过路由配置直接管理数据加载逻辑,将路由与数据需求紧密结合,减少组件中的逻辑复杂度。
    • 适合大型应用,在多级路由和页面跳转时更好地管理数据加载逻辑,避免在组件中重复处理数据获取和状态管理。
  2. 减少页面闪烁:

    • loader 在路由切换之前加载数据,避免在页面渲染之后再去获取数据,防止短暂的空白页面或加载状态。
    • 如果数据获取较慢,可以在路由层面处理加载指示器或错误页面。
  3. 统一错误处理

    • loader 允许集中处理数据加载错误,避免在每个组件中重复编写错误处理逻辑。配合 errorElement 可以在路由层展示错误信息。
  4. 更好的 SSR 支持

    • 如果应用使用服务端渲染(SSR),loader 可以在服务器端预先加载数据并将其注入到客户端,从而优化页面的首次渲染速度。

loader 的使用示例

1. 定义路由并指定 loader
import { createBrowserRouter, RouterProvider } from "react-router-dom";

const router = createBrowserRouter([
  {
    path: "/users/:id",
    element: <User />,
    loader: async ({ params }) => {
      // 模拟从 API 加载用户数据
      const response = await fetch(`/api/users/${params.id}`);
      return response.json(); // 返回的数据会传递到组件
    },
  },
]);

function App() {
  return <RouterProvider router={router} />;
}

2. 在组件中使用 useLoaderData 获取数据:

import { useLoaderData } from "react-router-dom";

function User() {
  const user = useLoaderData(); // 获取 loader 中加载的数据

  return (
    <div>
      <h1>{user.name}</h1>
      <p>{user.email}</p>
    </div>
  );
}

useEffect 方式的优点

  1. 灵活性

    • 在组件内使用 useEffect 加载数据更灵活,开发者可以根据组件的生命周期自由管理数据请求、状态和副作用处理。
    • 不依赖于路由配置,适合较小型应用或单独组件的场景。
  2. 与组件逻辑更紧密

    • 如果数据加载逻辑与组件状态、UI 逻辑高度耦合,直接在组件内管理会让代码更加集中,减少对路由配置的依赖。
    • 在某些场景下,可能组件的显示逻辑和加载数据的条件不完全依赖于路由,可以在组件内部按需触发数据请求。
  3. 简单的开发过程

    • 对于简单的页面或没有复杂路由层级的项目,直接使用 useEffect 可以避免引入复杂的路由配置,减少初期学习成本和代码复杂度。

选择的建议:

  1. 推荐使用 loader 的场景

    • 多级路由、大型项目,页面依赖的数据需要在页面加载之前获取。
    • 需要集中管理错误、加载状态,并减少在组件中处理数据的副作用。
    • SSR 场景,特别是需要在服务端渲染时获取数据。
  2. 推荐使用 useEffect 的场景

    • 页面数据加载的逻辑和组件渲染状态紧密相关,如需要基于组件内某些条件进行数据加载。
    • 需要灵活的按需数据请求,而不依赖于路由切换时加载数据。
    • 小型项目或独立组件,路由层面不需要管理复杂的加载逻辑。

;