React Router v6 中用于在导航到指定路由之前使用loader预加载数据 ...

打印 上一主题 下一主题

主题 1049|帖子 1049|积分 3147

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
在 React Router v6 中,loader 函数用于在导航到某个路由之前预加载数据。这是非常有效的功能,特殊是在必要从服务器获取数据并将其通报给组件的情况下。loader 函数可以资助你提前获取数据,从而进步用户体验和应用性能。
loader 函数的作用


  • 数据预加载

    • loader 函数在导航到指定路由之前被调用,用于获取必要的数据。
    • 这些数据可以是从服务器获取的 API 数据、当地存储的数据等。

  • 异步数据加载

    • loader 函数可以返回一个 Promise,通常用于处理异步操纵,如 fetch 哀求。
    • 如果 loader 函数返回一个 Promise,React Router 会等待 Promise 剖析后再渲染对应的组件。

  • 数据通报

    • loader 函数返回的数据可以通过 useLoaderData 钩子在组件中访问。
    • 这使得组件可以直接使用已经加载好的数据,而不必要再次发起哀求。

示例

假设你有一个简单的应用,包含一个根路由和一个子路由,每个路由都有一个 loader 函数来加载数据。
定义 loader 函数

  1. // rootLoader.js
  2. export async function rootLoader() {
  3.   const response = await fetch('https://api.example.com/root-data');
  4.   if (!response.ok) {
  5.     throw new Error('Failed to fetch root data');
  6.   }
  7.   return response.json();
  8. }
  9. // teamLoader.js
  10. export async function teamLoader() {
  11.   const response = await fetch('https://api.example.com/team-data');
  12.   if (!response.ok) {
  13.     throw new Error('Failed to fetch team data');
  14.   }
  15.   return response.json();
  16. }
复制代码
创建路由器

  1. import { createBrowserRouter } from 'react-router-dom';
  2. import Root from './components/Root';
  3. import Team from './components/Team';
  4. import { rootLoader } from './loaders/rootLoader';
  5. import { teamLoader } from './loaders/teamLoader';
  6. const router = createBrowserRouter([
  7.   {
  8.     path: '/',
  9.     element: <Root />,
  10.     loader: rootLoader,
  11.     children: [
  12.       {
  13.         path: 'team',
  14.         element: <Team />,
  15.         loader: teamLoader,
  16.       },
  17.     ],
  18.   },
  19. ]);
  20. export default router;
复制代码
使用 useLoaderData 钩子
在组件中使用 useLoaderData 钩子来访问 loader 函数返回的数据。
  1. // Root.js
  2. import React from 'react';
  3. import { useLoaderData } from 'react-router-dom';
  4. const Root = () => {
  5.   const rootData = useLoaderData();
  6.   return (
  7.     <div>
  8.       <h1>Root Component</h1>
  9.       <pre>{JSON.stringify(rootData, null, 2)}</pre>
  10.     </div>
  11.   );
  12. };
  13. export default Root;
  14. // Team.js
  15. import React from 'react';
  16. import { useLoaderData } from 'react-router-dom';
  17. const Team = () => {
  18.   const teamData = useLoaderData();
  19.   return (
  20.     <div>
  21.       <h1>Team Component</h1>
  22.       <pre>{JSON.stringify(teamData, null, 2)}</pre>
  23.     </div>
  24.   );
  25. };
  26. export default Team;
复制代码
loader 的作用和长处


  • 数据预加载:在组件渲染之前加载数据,可以克制在组件内部使用 useEffect 等钩子来举行数据哀求,从而进步性能。
  • 简化组件逻辑:将数据哀求逻辑从组件中抽离出来,使组件更专注于 UI 的渲染和交互逻辑。
  • 支持异步数据加载:loader 支持返回一个 Promise,如许可以在数据哀求完成后再渲染组件。
  • 错误处理:可以在 loader 中处理数据加载过程中的错误,比如返回一个错误页面或重定向到其他路径。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

我可以不吃啊

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表