Remix loader 函数是一个获取以后页面页面数据的函数,常常与 useLoaderData 一起配合应用
以后 Remix 版本:1.15.0
次要内容
- 定义形式
- loader 与 useLoaderData 应用
- 返回值类型以及应用办法
- 参数/上下文
- 重定向
- 错误处理
- laoder 操作纯 api 输入数据应用
loader 函数定义
- Remix Route 中定义 loader 函数
- export 对外裸露
- 返回 json/defer/ new Response 实例等
常常与 ORM/ODM 进行交互,从数据库获取数据。
loader 函数配合 useLoaderData 一起应用
import { json } from "@remix-run/node"; // or cloudflare/denoexport const loader = async () => { return json({ ok: true });};export default function Users() { const data = useLoaderData(); return ( <>{JSON.stringly(data)}</> );}
loader 函数返回值
- json 个别是同步数据,json 函数能够指定两个参数,第一个是 指标数据,第二个是 http 状态
export const loader = () => { json({jsonKey: "jsonValue"})}export const loader = () => { json({jsonKey: "jsonValue"}, { status: 200, headers: { "Cache-Control": "no-store" } })}
- defer 容许返回一个 promise, 个别配合
Await 组件应用
json 数据个别是返回一个同步 json 对象,然而 defer 容许咱们返回值能够是一个 promise
import { defer } from "@remix-run/node"; // or cloudflare/denoexport const loader = async () => { const thePromise = loadSlowDataAsync(); // 产生一个 Promise 值 // So you can write this without awaiting the promise: return defer({ critical: "data", slowPromise: thePromise, // 间接将 Promise 的值交给 defer });};
值得注意的是 defer 返回的值不间接应用,须要配合 Suspense
+ Await
组件应用, 上面是一个 loader 返回 defer 的示例:
import { defer } from "@remix-run/node";import { Await, useLoaderData } from "@remix-run/react";import { Suspense } from "react";export const loader = () => { let p = new Promise((resolve) => { setTimeout(() => { resolve("defer a promise value"); }, 2000); }); return defer({ pv: p, });};export default function Defer() { const data = useLoaderData(); console.log(data); return ( <div> <div>This is defer value: </div> <Suspense fallback={<div>Loading...</div>}> <Await resolve={data.pv}>{(data) => <div>{data}</div>}</Await> </Suspense> </div> );