0Pricing
React Academy · บทเรียน

ตัวโหลดและแอ็กชัน (Data Router API)

ดึงข้อมูลของเส้นทางก่อนเรนเดอร์ด้วยตัวโหลด และจัดการการส่งฟอร์มด้วยแอ็กชัน

ตัวโหลดและแอ็กชัน (Data Router API) เป็นบทเรียน React Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน React Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส React Academy มีบทเรียนทั้งหมด 4 บทเรียน

ตัวโหลดคืออะไร

ใน Data Router ของ React Router v6.4 ขึ้นไป ตัวโหลด คือฟังก์ชันแบบอะซิงโครนัสของเส้นทางที่ดึงข้อมูล ก่อน แสดงเส้นทาง ซึ่งมาแทนรูปแบบการดึงข้อมูลด้วย useEffect

การกำหนดตัวโหลด

เพิ่มพร็อพเพอร์ตี loader ให้กับออบเจ็กต์เส้นทาง โดยจะได้รับ { params, request } และส่งคืนข้อมูล (หรือ Response)

import { createBrowserRouter } from 'react-router-dom';

async function userLoader({ params }) {
  const res = await fetch(`/api/users/${params.id}`);
  if (!res.ok) throw new Response('Not Found', { status: 404 });
  return res.json();
}

const router = createBrowserRouter([
  { path: '/users/:id', element: <UserDetail />, loader: userLoader },
]);

การอ่านข้อมูลจากตัวโหลดด้วย useLoaderData

useLoaderData() จะส่งคืนค่าที่ตัวโหลดส่งคืน คอมโพเนนต์จะแสดงผลหลังจากตัวโหลดทำงานเสร็จแล้วเท่านั้น

import { useLoaderData } from 'react-router-dom';

function UserDetail() {
  const user = useLoaderData();
  return <h1>{user.name}</h1>;
}

แอ็กชันคืออะไร

แอ็กชัน คือฟังก์ชันแบบอะซิงโครนัสที่จัดการการเปลี่ยนแปลงข้อมูล (การส่งแบบฟอร์มและการลบข้อมูล) โดยจะทำงานก่อนที่เส้นทางจะแสดงผลใหม่หลังการส่งแบบฟอร์มแบบ POST

async function createUserAction({ request }) {
  const formData = await request.formData();
  const name = formData.get('name');
  await fetch('/api/users', {
    method: 'POST',
    body: JSON.stringify({ name }),
    headers: { 'Content-Type': 'application/json' },
  });
  return redirect('/users');
}

การใช้ Form เพื่อเรียกใช้แอ็กชัน

แทนที่ <form> ด้วย <Form> ของ React Router เมื่อส่งแบบฟอร์ม ระบบจะแปลงฟิลด์เป็น FormData และเรียกใช้แอ็กชันของเส้นทาง

import { Form } from 'react-router-dom';

function NewUser() {
  return (
    <Form method="post">
      <input name="name" />
      <button type="submit">Create</button>
    </Form>
  );
}

การส่งคืนข้อมูลจากแอ็กชัน

แอ็กชันสามารถส่งคืนข้อมูลได้ ไม่ใช่เพียงการเปลี่ยนเส้นทางเท่านั้น ให้อ่านข้อมูลในคอมโพเนนต์ด้วย useActionData() ซึ่งเหมาะสำหรับส่งคืนข้อผิดพลาดจากการตรวจสอบข้อมูล

async function loginAction({ request }) {
  const data = await request.formData();
  const errors = validate(data);
  if (errors) return errors; // returned to useActionData
  await login(data);
  return redirect('/dashboard');
}

function Login() {
  const errors = useActionData();
  return (
    <Form method="post">
      {errors?.email && <p>{errors.email}</p>}
      <input name="email" />
    </Form>
  );
}

สถานะกำลังโหลดด้วย useNavigation

useNavigation() แจ้งให้ทราบว่าตัวโหลดหรือแอ็กชันกำลังทำงานอยู่หรือไม่ คุณจึงสามารถแสดงตัวหมุนหรือปิดใช้งานปุ่มส่งได้

function SubmitButton() {
  const navigation = useNavigation();
  const isSubmitting = navigation.state === 'submitting';
  return (
    <button type="submit" disabled={isSubmitting}>
      {isSubmitting ? 'Saving...' : 'Save'}
    </button>
  );
}

ข้อมูลแบบเลื่อนการส่งคืนด้วย defer()

ใช้ defer() เพื่อส่งคืนพรอมิสของข้อมูลที่โหลดช้าจากตัวโหลดโดยไม่บล็อกการแสดงผล จากนั้นคลายค่าด้วย <Await> และ Suspense

import { defer, Await } from 'react-router-dom';

async function slowLoader() {
  return defer({ fast: await getFast(), slow: getSlow() });
}

function Page() {
  const { fast, slow } = useLoaderData();
  return (
    <>
      <h1>{fast.title}</h1>
      <Suspense fallback={<p>Loading...</p>}>
        <Await resolve={slow}>{data => <Chart data={data} />}</Await>
      </Suspense>
    </>
  );
}

การตรวจสอบข้อมูลใหม่หลังแอ็กชัน

หลังจากแอ็กชันทำงานเสร็จ React Router จะเรียกใช้ตัวโหลดที่กำลังทำงานอยู่ทั้งหมดอีกครั้งโดยอัตโนมัติเพื่ออัปเดตข้อมูล จึงไม่ต้องดึงข้อมูลใหม่ด้วยตนเอง

การจัดการข้อผิดพลาดในตัวโหลด

โยน Response หรือข้อผิดพลาดใด ๆ จากตัวโหลดได้ React Router จะดักจับข้อผิดพลาดและแสดง errorElement ของเส้นทาง ซึ่งเข้าถึงได้ผ่าน useRouteError()

function ErrorPage() {
  const error = useRouteError();
  return (
    <div>
      <h1>{error.status} {error.statusText}</h1>
    </div>
  );
}

Fetcher สำหรับการเปลี่ยนแปลงที่ไม่เปลี่ยนเส้นทาง

useFetcher() ช่วยให้คุณเรียกใช้ตัวโหลดหรือแอ็กชันโดยไม่เปลี่ยนเส้นทาง เหมาะสำหรับแบบฟอร์มในบรรทัด เช่น การกดถูกใจโพสต์โดยไม่ออกจากหน้า

function LikeButton({ postId }) {
  const fetcher = useFetcher();
  return (
    <fetcher.Form method="post" action={`/posts/${postId}/like`}>
      <button type="submit">Like</button>
    </fetcher.Form>
  );
}

ตรวจสอบอย่างรวดเร็ว

ฮุกใดใช้อ่านข้อมูลที่ฟังก์ชันตัวโหลดของเส้นทางส่งคืน

สรุปทบทวน

Data API ของ React Router ใช้ ตัวโหลด เพื่อดึงข้อมูลก่อนแสดงผล และใช้ แอ็กชัน เพื่อจัดการการเปลี่ยนแปลงข้อมูล คอมโพเนนต์อ่านข้อมูลจากตัวโหลดผ่าน useLoaderData() อ่านผลลัพธ์จากแอ็กชันผ่าน useActionData() และอ่านสถานะการเปลี่ยนเส้นทางผ่าน useNavigation()

คำถามที่พบบ่อย

บทเรียน “ตัวโหลดและแอ็กชัน (Data Router API)” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “ตัวโหลดและแอ็กชัน (Data Router API)” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส React Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส React Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “ตัวโหลดและแอ็กชัน (Data Router API)”

ดึงข้อมูลของเส้นทางก่อนเรนเดอร์ด้วยตัวโหลด และจัดการการส่งฟอร์มด้วยแอ็กชัน คุณปฏิบัติ React Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน React Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน React Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน

บทเรียน “ตัวโหลดและแอ็กชัน (Data Router API)” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน React Academy นี้ได้ไหม

ได้ บทเรียน React Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. เส้นทางซ้อนกันและเลย์เอาต์ Outlet
  2. ตัวโหลดและแอ็กชัน (Data Router API)
  3. เส้นทางที่มีการป้องกันและตัวตรวจสอบสิทธิ์
  4. การจัดการสถานะในพารามิเตอร์ค้นหาของ URL
← กลับไปที่ React Academy