Remix路由模块输出对象loader函数详解

目录
  • 主要内容
    • loader 函数定义
    • loader 函数配合 useLoaderData 一起使用
    • loader 函数返回值
    • loader 函数的类型
    • loader 函数中获取 params
    • loader 函数中处理 headers
    • loader 函数上下文
    • loader 中重定向到
    • 错误处理
    • 在页面中的表现
  • loader 作为纯 api 输出数据使用
  • 小结

主要内容

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/deno
export 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/deno
export 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>
  );
  • new Response 一个标准的响应示例
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 一个指定 http 状态码,如 401:
throw json(
      { invoiceOwnerEmail: invoice.owner.email },
      { status: 401 }
    );
  • 使用 CatchBoundary + useCatch 捕获错误
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>
  );
}

在页面中的表现

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

loader 作为纯 api 输出数据使用

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

  • 定于路由: api.loader.tsx
export const loader = () => {
  return {
    a: 1
  }
}

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

小结

从文中可以看到, Remix Loader 提供强大的数据处理能力,通过 window.__remixContext 提供上下文, loder 中支持获取 json 数据, defer 异步数据,使用 Fetch API 的 Response 标准响应一个数据。能使用自定义上下文,能重定向等等。

以上就是Remix路由模块输出对象loader函数详解的详细内容,更多关于Remix路由模块输出对象loader的资料请关注我们其它相关文章!

(0)

相关推荐

  • Remix后台开发之remix-antd-admin配置过程

    目录 Remix Antd Admin Project experience URL Current Remix Version 设计动机 核心包 国际化 图表库 裁剪工具 Remix 优点 用法 格式化工具 支持 Remix Antd Admin 一款基于 Remix / Antd / Echarts / Styled-components 的管理系统,可快速进行项目初始化.(本项目偏前端) Project experience URL 访问地址(注意部署在 vercel):remix-ant

  • Remix如何支持原生 CSS方法详解

    目录 Remix CSS 语法 links 函数写法 links 函数层级 links 函数中 css 媒体查询 第三方 css import 语法 小结 Remix CSS 语法 Remix 是一个多页面的框架,对页面的原生 CSS 的支持分为两大类型: 使用 links 函数,转换成 link 标签支持 css 使用 javascript import 语法支持 css ,但是最终也会成为 link 标签 驼峰命名法 .PrimaryButton { /* ... */ } html 属性法

  • Remix 路由模块输出对象handle函数

    目录 正文 在哪里可以定义 handle? 在根路由定义 在页面 _index 路由中与 useMatch 一起 match 数组 使用场景 正文 Remix handle 函数是一个有用的对外输出的 Route 模块对象,用于暴露特定的数据 match 对象,它们经常在一起使用. 当前 Remix 版本:1.15.0 在哪里可以定义 handle? root 根组件 路由页面 在根路由定义 import { /.../ } from "@remix-run/react"; // 根路

  • Remix 后台桌面开发electron-remix-antd-admin

    目录 Remix Antd Admin Electron 项目地址 当前 Remix 版本 设计动机 Core Packages 增加左面主文件 增加 Remix 配置文件 增加 nodemon.json 核心包 国际化 图表库 裁剪工具 优点 npmrc config 使用方法 格式化工具 构建 支持 Remix Antd Admin Electron 基于 Electron/Remix/Antd/Echarts/Styled-components 的管理系统,能够快速初始化项目. 项目地址

  • 全栈轻量级搭配之Remix Prisma Sqlite使用分析

    目录 一.为什么是 Remix/Prisma/Sqlite ? 二.Prisma 命令提前看 三.在 Remix 中添加 Sqlite 和 Prisma 的流程如下: 1.安装依赖 2.用 sqlite 初始化 prisma 3.在 Schema 文件中添加模型 4.生成客户端代码 5.使用迁移命令 6.在 studio 中查看 7.在 Remix 中使用 ①. 对外暴露 db ②. 抽象模型层 ③. 在 action/loader 中使用模型层操作数据库 ④. 额外的 seed 初始化 四.流

  • Remix中mdx table不支持表格解决

    目录 remix 配置文件中配置 mdx 属性 添加插件 remark-gfm remix 配置文件中配置 mdx 属性 remix 中支持 md/mdx 语法,但是 Remix 语法没有内置对 markdown 表格的支持. mdx 配置在 Remix 文档很不明显,从 remix 的配置文件的 .d.ts 文件. export interface AppConfig { mdx?: RemixMdxConfig | RemixMdxConfigFunction; } export inter

  • js的对象与函数详解

    一.对象 就是人们要研究的任何事物,不仅能表示具体事物,还能表示抽象的规则,计划或事件.          属性的无序集合,每个属性可以存一个值(原始值,对象,函数) 对象的特性:封装,尽可能的隐藏对象的部分细节,使其受到保护.只保留有限的接口和外部发生联系. js 中{},[] 来定义数组和对象 1.{ } 大括号,表示定义一个对象,大部分情况下要有成对的属性和值,或是函数. 2.[ ]中括号,表示一个数组,也可以理解为一个数组对象. 3.{ } 和[ ] 一起使用,我们前面说到,{ } 是一

  • PHP输出缓冲控制Output Control系列函数详解

    概述 以前研究过PHP的输入输出缓冲,不过博客搬家以后,原来文章找不到了,今天看到一篇好文,顺便转载过来. 简介 说到输出缓冲,首先要说的是一个叫做缓冲器(buffer)的东西.举个简单的例子说明他的作用:我们在编辑一篇文档时,在我们没有保存之前,系统是不会向磁盘写入的,而是写到buffer中,当buffer写满或者执行了保存操作,才会将数据写入磁盘.对于PHP来说,每一次像 echo 这样的输出操作,同样是先写入到了 php buffer 里,在脚本执行完毕或者执行了强制输出缓存操作,数据才会

  • C++函数对象Functor与匿名函数对象Lambda表达式详解

    目录 1函数对象Functor(仿函数) 1.1概念 1.2代码实例 1.3调用效率 2.匿名函数对象Lambda表达式 2.1使用形式 2.2代码实例 3总结 1函数对象Functor(仿函数) 1.1概念 函数对象就是类对象,生成这个类对象的类中,拥有一个小括号运算符重载函数. 重载了小括号运算符的类的类对象,就叫函数对象. 1.2代码实例 #include <iostream> using namespace std; template <class T1> class A

  • js正则表达式常用函数详解(续)

    正则表达式对象的方法 1.test,返回一个 Boolean 值,它指出在被查找的字符串中是否存在模式.如果存在则返回 true,否则就返回 false. 2.exec,用正则表达式模式在字符串中运行查找,并返回包含该查找结果的一个数组. 3.compile,把正则表达式编译为内部格式,从而执行得更快. 正则表达式对象的属性 1.source,返回正则表达式模式的文本的复本.只读. 2.lastIndex,返回字符位置,它是被查找字符串中下一次成功匹配的开始位置. 3.input ($_),返回

  • OraclePL/SQL单行函数和组函数详解

    正在看的ORACLE教程是:OraclePL/SQL单行函数和组函数详解. 1 函数是一种有零个或多个参数并且有一个返回值的程序.在SQL中Oracle内建了一系列函数,这些函数都可被称为SQL或PL/SQL语句,函数主要分为两大类:  2  3 单行函数  4  5 组函数   6  7 本文将讨论如何利用单行函数以及使用规则.  8  9 SQL中的单行函数 10 11 SQL和PL/SQL中自带很多类型的函数,有字符.数字.日期.转换.和混合型等多种函数用于处理单行数据,因此这些都可被统称

  • Oracle中的游标和函数详解

     Oracle中的游标和函数详解 1.游标 游标是一种 PL/SQL 控制结构:可以对 SQL 语句的处理进行显示控制,便于对表的行数据 逐条进行处理. 游标并不是一个数据库对象,只是存留在内存中. 操作步骤: 声明游标    打开游标 取出结果,此时的结果取出的是一行数据 关闭游标 到底那种类型可以把一行的数据都装进来 此时使用 ROWTYPE 类型,此类型表示可以把一行的数据都装进来. 例如:查询雇员编号为 7369 的信息(肯定是一行信息). 例:查询雇员编号为 7369 的信息(肯定是一

  • jQuery position() 函数详解以及jQuery中position函数的应用

    position()函数用于返回当前匹配元素相对于其被定位的祖辈元素的偏移,也就是相对于被定位的祖辈元素的坐标.该函数只对可见元素有效. 所谓"被定位的元素",就是元素的CSS position属性值为absolute.relative或fixed(只要不是默认的static即可). 该函数返回一个坐标对象,该对象有一个left属性和top属性.属性值均为数字,它们都以像素(px)为单位. 与offset()不同的是:position()返回的是相对于被定位的祖辈元素的坐标,offse

  • Python入门之三角函数atan2()函数详解

    描述 atan2() 返回给定的 X 及 Y 坐标值的反正切值. 语法 以下是 atan2() 方法的语法: import math math.atan2(y, x) 注意:atan2()是不能直接访问的,需要导入 math 模块,然后通过 math 静态对象调用该方法. 参数 x -- 一个数值. y -- 一个数值. 返回值 返回给定的 X 及 Y 坐标值的反正切值. 实例 以下展示了使用 atan2() 方法的实例: #!/usr/bin/python import math print

  • 基于python内置函数与匿名函数详解

    内置函数 Built-in Functions abs() dict() help() min() setattr() all() dir() hex() next() slice() any() divmod() id() object() sorted() ascii() enumerate() input() oct() staticmethod() bin() eval() int() open() str() bool() exec() isinstance() pow() super

  • 浅谈Python中的zip()与*zip()函数详解

    前言 1.实验环境: Python 3.6: 2.示例代码地址:下载示例: 3.本文中元素是指列表.元组.字典等集合类数据类型中的下一级项目(可能是单个元素或嵌套列表). zip(*iterables)函数详解 zip()函数的定义 从参数中的多个迭代器取元素组合成一个新的迭代器: 返回: 返回一个zip对象,其内部元素为元组:可以转化为列表或元组: 传入参数:元组.列表.字典等迭代器. zip()函数的用法 当zip()函数中只有一个参数时 zip(iterable)从iterable中依次取

随机推荐