loader
观看 📼 Remix Single:将数据加载到组件中
每个路由可以定义一个 loader
函数,在渲染时向路由提供数据。
此函数仅在服务器上运行。在初始服务器渲染时,它将向 HTML 文档提供数据。在浏览器中导航时,Remix 将通过浏览器中的 fetch
调用该函数。
这意味着您可以直接与数据库对话,使用仅限服务器的 API 机密等。任何未用于呈现 UI 的代码都将从浏览器包中删除。
以数据库 ORM Prisma为例:
因为 prisma
仅在 loader
中使用,所以它将被编译器从浏览器包中删除,如突出显示的行所示。
请注意,即使组件不渲染它,从`加载器`返回的任何内容都将暴露给客户端。请像对待公共 API 端点一样小心对待您的`加载器`。
类型安全
您可以使用 useLoaderData<typeof loader>
通过网络为您的 loader
和组件获得类型安全。
data.name
会知道它是一个字符串
data.date
也会知道它是一个字符串,即使我们向 json
传递了一个日期对象。当为客户端转换获取数据时,这些值会通过 JSON.stringify
在网络上序列化,并且类型知道这一点
params
路由参数由路由文件名定义。如果某个段以 $
开头,如 $invoiceId
,则该段的 URL 值将传递给您的加载器
。
参数主要用于通过 ID 查找记录:
请求
这是一个 Fetch Request 实例。您可以阅读 MDN 文档以查看其所有属性。
loader
中最常见的用例是从请求中读取 headers(如 cookies)和 URL URLSearchParams
:
context
这是传递到服务器适配器的 getLoadContext()
函数的上下文。这是弥补适配器请求 / 响应 API 与 Remix 应用之间差距的一种方法。
此 API 是一个紧急出口,很少需要它
以 express 适配器为例:
然后你的 loader
就可以访问它了。
返回响应实例
您需要从加载器
返回一个 获取响应。
使用 json
助手 简化了这个过程,所以您不必自己构建它们,但这两个示例实际上是相同的!
您可以看到 json
如何完成少量工作,让您的 loader
更加简洁。您还可以使用 json
助手向您的响应添加标头或状态代码:
参见:
在 Loaders 中抛出响应
除了返回响应之外,您还可以从加载器
中抛出 Response
对象。这允许您突破调用堆栈并执行以下两项操作之一:
- 重定向到另一个 URL
- 通过
ErrorBoundary
显示带有上下文数据的替代 UI
这是一个完整的示例,展示了如何创建实用函数来抛出响应以停止加载器中的代码执行并显示备用 UI。