最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Remix路由模塊輸出對(duì)象loader函數(shù)詳解

 更新時(shí)間:2023年04月10日 14:40:18   作者:?jiǎn)讨蝊x  
這篇文章主要為大家介紹了Remix路由模塊輸出對(duì)象loader函數(shù)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪<BR>

主要內(nèi)容

Remix loader 函數(shù)是一個(gè)獲取當(dāng)前頁(yè)面頁(yè)面數(shù)據(jù)的函數(shù),經(jīng)常與 useLoaderData 一起配合使用

當(dāng)前 Remix 版本:1.15.0

  • 定義方式
  • loader 與 useLoaderData 使用
  • 返回值類型以及使用方法
  • 參數(shù)/上下文
  • 重定向
  • 錯(cuò)誤處理
  • laoder 操作純 api 輸出數(shù)據(jù)使用

loader 函數(shù)定義

  • Remix Route 中定義 loader 函數(shù)
  • export 對(duì)外暴露
  • 返回 json/defer/ new Response 實(shí)例等

經(jīng)常與 ORM/ODM 進(jìn)行交互,從數(shù)據(jù)庫(kù)獲取數(shù)據(jù)。

loader 函數(shù)配合 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 函數(shù)返回值

  • json 一般是同步數(shù)據(jù),json 函數(shù)可以指定兩個(gè)參數(shù),第一個(gè)是 目標(biāo)數(shù)據(jù),第二個(gè)是 http 狀態(tài)
export const loader = () => {
  json({jsonKey: "jsonValue"})
}
export const loader = () => {
  json({jsonKey: "jsonValue"}, {
    status: 200,
    headers: {
      "Cache-Control": "no-store"
    }
  })
}
  • defer 允許返回一個(gè) promise, 一般配合 Await 組件使用

json 數(shù)據(jù)一般是返回一個(gè)同步 json 對(duì)象,但是 defer 允許我們返回值可以是一個(gè) promise

import { defer } from "@remix-run/node"; // or cloudflare/deno
export const loader = async () => {
  const thePromise = loadSlowDataAsync(); // 產(chǎn)生一個(gè) Promise 值
  // So you can write this without awaiting the promise:
  return defer({
    critical: "data",
    slowPromise: thePromise, // 直接將 Promise 的值交給 defer
  });
};

值得注意的是 defer 返回的值不直接使用,需要配合 Suspense + Await 組件使用, 下面是一個(gè) 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 一個(gè)標(biāo)準(zhǔn)的響應(yīng)示例
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 的響應(yīng)對(duì)象。

loader 函數(shù)的類型

loader 函數(shù)打通了其類型,在使用的是 typeof 執(zhí)行 loader 函數(shù)配合 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 函數(shù)中獲取 params

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

一般 id 用于提供給后端查詢數(shù)據(jù)庫(kù)

loader 函數(shù)中處理 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 對(duì)象使用 get 獲取 “Cookie” headers 然后使用 request.url 獲取 searchParams 這些常用的 url 數(shù)據(jù)。

loader 函數(shù)上下文

如果你有一些上下文,需要串可以修改 server.js 中的內(nèi)容,這里以 exprss 為例:

const {
  createRequestHandler,
} = require("@remix-run/express");
// 對(duì)所有的請(qǐng)求,創(chuàng)建一個(gè)對(duì)象,提供上下文
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函數(shù)中能使用 redirect 函數(shù)進(jìn)行重定向

錯(cuò)誤處理

  • throw 一個(gè)指定 http 狀態(tài)碼,如 401:
throw json(
      { invoiceOwnerEmail: invoice.owner.email },
      { status: 401 }
    );
  • 使用 CatchBoundary + useCatch 捕獲錯(cuò)誤
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>
  );
}

在頁(yè)面中的表現(xiàn)

使用 loader 獲取的數(shù)據(jù),獲取保存在 html 文檔的 window.__remixContext 對(duì)象里面。

loader 作為純 api 輸出數(shù)據(jù)使用

Remix 是一個(gè)全??蚣?,loader 函數(shù)用于對(duì)外輸出數(shù)據(jù),這里將 loader 定義為一個(gè)純的 api 接口使用 loader 對(duì)外提供數(shù)據(jù):

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

啟動(dòng)服務(wù),直接訪問(wèn) /api/loader 接口得默認(rèn)使用 get 方法 json 數(shù)據(jù)。如果要處理不同的請(qǐng)求方式,可以在 loader 函數(shù)的參數(shù)中獲取。

小結(jié)

從文中可以看到, Remix Loader 提供強(qiáng)大的數(shù)據(jù)處理能力,通過(guò) window.__remixContext 提供上下文, loder 中支持獲取 json 數(shù)據(jù), defer 異步數(shù)據(jù),使用 Fetch API 的 Response 標(biāo)準(zhǔn)響應(yīng)一個(gè)數(shù)據(jù)。能使用自定義上下文,能重定向等等。

以上就是Remix路由模塊輸出對(duì)象loader函數(shù)詳解的詳細(xì)內(nèi)容,更多關(guān)于Remix路由模塊輸出對(duì)象loader的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • webpack構(gòu)建react多頁(yè)面應(yīng)用詳解

    webpack構(gòu)建react多頁(yè)面應(yīng)用詳解

    這篇文章主要介紹了webpack構(gòu)建react多頁(yè)面應(yīng)用詳解,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-09-09
  • React router cache route實(shí)現(xiàn)緩存頁(yè)面流程介紹

    React router cache route實(shí)現(xiàn)緩存頁(yè)面流程介紹

    react-router自身沒(méi)有路由緩存的特性,在5.x版本之前,我們可以基于react-router-cache-route來(lái)實(shí)現(xiàn)路由緩存功能。但是react-router 6.x在實(shí)現(xiàn)上做了比較大的變化,react-router-cache-route沒(méi)有提供相應(yīng)的支持
    2023-01-01
  • React?useEffect異步操作常見(jiàn)問(wèn)題小結(jié)

    React?useEffect異步操作常見(jiàn)問(wèn)題小結(jié)

    本文主要介紹了React?useEffect異步操作常見(jiàn)問(wèn)題小結(jié),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • React前端渲染優(yōu)化--父組件導(dǎo)致子組件重復(fù)渲染的問(wèn)題

    React前端渲染優(yōu)化--父組件導(dǎo)致子組件重復(fù)渲染的問(wèn)題

    本篇文章是針對(duì)父組件導(dǎo)致子組件重復(fù)渲染的優(yōu)化方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • React深入淺出分析Hooks源碼

    React深入淺出分析Hooks源碼

    在react類組件(class)寫(xiě)法中,有setState和生命周期對(duì)狀態(tài)進(jìn)行管理,但是在函數(shù)組件中不存在這些,故引入hooks(版本:>=16.8),使開(kāi)發(fā)者在非class的情況下使用更多react特性
    2022-11-11
  • React 如何使用時(shí)間戳計(jì)算得到開(kāi)始和結(jié)束時(shí)間戳

    React 如何使用時(shí)間戳計(jì)算得到開(kāi)始和結(jié)束時(shí)間戳

    這篇文章主要介紹了React 如何拿時(shí)間戳計(jì)算得到開(kāi)始和結(jié)束時(shí)間戳,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-09-09
  • React開(kāi)發(fā)進(jìn)階redux saga使用原理詳解

    React開(kāi)發(fā)進(jìn)階redux saga使用原理詳解

    這篇文章主要為大家介紹了React開(kāi)發(fā)進(jìn)階redux saga使用原理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-11-11
  • 詳解如何在React中有效地監(jiān)聽(tīng)鍵盤(pán)事件

    詳解如何在React中有效地監(jiān)聽(tīng)鍵盤(pán)事件

    React是一種流行的JavaScript庫(kù),用于構(gòu)建用戶界面,它提供了一種簡(jiǎn)單而靈活的方式來(lái)創(chuàng)建交互式的Web應(yīng)用程序,在React中,我們經(jīng)常需要監(jiān)聽(tīng)用戶的鍵盤(pán)事件,以便根據(jù)用戶的輸入做出相應(yīng)的反應(yīng),本文將向您介紹如何在React中有效地監(jiān)聽(tīng)鍵盤(pán)事件,并展示一些常見(jiàn)的應(yīng)用場(chǎng)景
    2023-11-11
  • React?代碼拆分的幾種方法示例詳解

    React?代碼拆分的幾種方法示例詳解

    這篇文章主要為大家介紹了React?代碼拆分的幾種方法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-03-03
  • 詳解操作虛擬dom模擬react視圖渲染

    詳解操作虛擬dom模擬react視圖渲染

    這篇文章主要介紹了詳解操作虛擬dom模擬react視圖渲染,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-07-07

最新評(píng)論

栖霞市| 山东省| 莲花县| 荥经县| 蒙山县| 沈阳市| 湖南省| 五峰| 漳州市| 宜兰县| 乐平市| 阳江市| 马公市| 温州市| 隆回县| 思南县| 民乐县| 永善县| 关岭| 崇礼县| 芦溪县| 景德镇市| 易门县| 达日县| 五台县| 临城县| 望都县| 怀柔区| 永年县| 攀枝花市| 安图县| 青冈县| 清原| 呼图壁县| 江川县| 沾化县| 武城县| 新泰市| 黑河市| 岫岩| 平舆县|