文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Remix路由模块输出对象loader函数怎么使用

2023-07-05 23:57

关注

本篇内容介绍了“Remix路由模块输出对象loader函数怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

主要内容

Remix loader 函数是一个获取当前页面页面数据的函数,经常与 useLoaderData 一起配合使用

当前 Remix 版本:1.15.0

loader 函数定义

经常与 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 函数返回值

export const loader = () => {  json({jsonKey: "jsonValue"})}export const loader = () => {  json({jsonKey: "jsonValue"}, {    status: 200,    headers: {      "Cache-Control": "no-store"    }  })}

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>  );
export async function loader() {  const body = JSON.stringify({ loader: "loader data"});  return new Response(body, {    headers: {      "Content-Type": "application/json",    },  });}export default function() {  return <div>loader.response</div>}

Response 是 Fetch API 的响应对象。

loader 函数的类型

loader 函数打通了其类型,在使用的是 typeof 执行 loader 函数配合 LoaderArgs 类型:

import type { LoaderArgs } from "@remix-run/node";import { json } from "@remix-run/node";import { useLoaderData } from "@remix-run/react";export async function loader(args: LoaderArgs) {  return json({ name: "Ryan", date: new Date() });}export default function SomeRoute() {  const data = useLoaderData<typeof loader>();}

loader 函数中获取 params

export async function loader({ params }: LoaderArgs) {  let id = params.id; // "123"}

一般 id 用于提供给后端查询数据库

loader 函数中处理 headers

export async function loader({ request }: LoaderArgs) {  // read a cookie  const cookie = request.headers.get("Cookie");  // parse the search params for `?q=`  const url = new URL(request.url);  const query = url.searchParams.get("q");}

从 request 对象使用 get 获取 “Cookie” headers 然后使用 request.url 获取 searchParams 这些常用的 url 数据。

loader 函数上下文

如果你有一些上下文,需要串可以修改 server.js 中的内容,这里以 exprss 为例:

const {  createRequestHandler,} = require("@remix-run/express");// 对所有的请求,创建一个对象,提供上下文app.all(  "*",  createRequestHandler({    getLoadContext(req, res) {      // this becomes the loader context      return { expressUser: req.user };    },  }));// 在 loader 中使用上下文export async function loader({ context }: LoaderArgs) {  const { expressUser } = context;  // ...}

loader 中重定向到

import { redirect } from "@remix-run/node";export async function loader() {  return redirect('/abc')}export default function() {  return <div>loader.response</div>}

在 loader函数中能使用 redirect 函数进行重定向

错误处理

throw json(      { invoiceOwnerEmail: invoice.owner.email },      { status: 401 }    );
export function CatchBoundary() {  // this returns { data, status, statusText }  const caught = useCatch<ThrownResponses>();  switch (caught.status) {    case 401:      return (        <div>          <p>You don't have access to this invoice.</p>          <p>            Contact {caught.data.invoiceOwnerEmail} to get            access          </p>        </div>      );    case 404:      return <div>Invoice not found!</div>;  }  // You could also `throw new Error("Unknown status in catch boundary")`.  // This will be caught by the closest `ErrorBoundary`.  return (    <div>      Something went wrong: {caught.status}{" "}      {caught.statusText}    </div>  );}

在页面中的表现

Remix路由模块输出对象loader函数怎么使用

使用 loader 获取的数据,获取保存在 html 文档的 window.__remixContext 对象里面。

loader 作为纯 api 输出数据使用

Remix 是一个全栈框架,loader 函数用于对外输出数据,这里将 loader 定义为一个纯的 api 接口使用 loader 对外提供数据:

export const loader = () => {  return {    a: 1  }}

启动服务,直接访问 /api/loader 接口得默认使用 get 方法 json 数据。如果要处理不同的请求方式,可以在 loader 函数的参数中获取。

“Remix路由模块输出对象loader函数怎么使用”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯