ตัวโหลดและแอ็กชัน (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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- เส้นทางซ้อนกันและเลย์เอาต์ Outlet
- ตัวโหลดและแอ็กชัน (Data Router API)
- เส้นทางที่มีการป้องกันและตัวตรวจสอบสิทธิ์
- การจัดการสถานะในพารามิเตอร์ค้นหาของ URL