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

ฮุก use() สำหรับทรัพยากรแบบอะซิงก์

อ่าน promise และ Context ระหว่างการเรนเดอร์ด้วยฮุก use() ใน React 19

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

ยินดีต้อนรับ

ในบทเรียนนี้ คุณจะใช้ฮุก use() ของ React 19 เพื่ออ่าน promise และค่าของ context ได้โดยตรงภายในฟังก์ชันเรนเดอร์ ทำให้การเข้าถึงข้อมูลแบบอะซิงโครนัสง่ายขึ้น

use() คืออะไร

use() คือฮุกของ React 19 ที่อ่านทรัพยากร ซึ่งอาจเป็น Promise หรือ Context ได้พร้อมกันภายในฟังก์ชันเรนเดอร์ หาก Promise ยังอยู่ระหว่างดำเนินการ คอมโพเนนต์จะหยุดรอ และขอบเขต Suspense ที่อยู่ใกล้ที่สุดจะแสดงเนื้อหาสำรอง
import { use } from 'react';

function UserProfile({ userPromise }) {
  const user = use(userPromise); // suspends if pending
  return <h1>{user.name}</h1>;
}

การส่ง Promise เป็น Props

รูปแบบที่ใช้กันทั่วไปใน React 19 คือ คอมโพเนนต์ฝั่งเซิร์ฟเวอร์สร้าง Promise (เช่น query ฐานข้อมูล) ส่งต่อให้คอมโพเนนต์ฝั่งไคลเอนต์ แล้วคอมโพเนนต์ฝั่งไคลเอนต์อ่านค่าด้วย use() ขอบเขต Suspense จะอยู่ที่ใดก็ได้เหนือคอมโพเนนต์นั้น
// Server Component
export default function Page() {
  const userPromise = fetchUser(1); // NOT awaited
  return (
    <Suspense fallback={<Spinner />}>
      <Profile userPromise={userPromise} />
    </Suspense>
  );
}

// Client Component
'use client';
export function Profile({ userPromise }) {
  const user = use(userPromise);
  return <p>{user.name}</p>;
}

use() เทียบกับ useEffect สำหรับข้อมูล

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

use() สำหรับ Context

use() ยังสามารถอ่านค่าของ context ได้เช่นเดียวกับ useContext ความแตกต่างคือ use() สามารถเรียกตามเงื่อนไขได้ (ภายใน if หรือวนซ้ำ) ต่างจาก useContext ที่ต้องปฏิบัติตาม Rules of Hooks
import { use } from 'react';
import { ThemeContext } from './ThemeContext';

function Button({ danger }) {
  if (danger) {
    const theme = use(ThemeContext); // conditional — allowed with use()!
    return <button style={{ color: theme.red }}>Delete</button>;
  }
  return <button>Click</button>;
}

การจัดการข้อผิดพลาดด้วย ErrorBoundary

หาก Promise ที่ส่งให้ use() ถูกปฏิเสธ React จะโยนข้อผิดพลาด ให้ครอบคอมโพเนนต์ด้วย ErrorBoundary เพื่อจับข้อผิดพลาดและแสดงเนื้อหาสำรอง
<ErrorBoundary fallback={<Error />}>
  <Suspense fallback={<Loading />}>
    <Profile userPromise={fetchUser(id)} />
  </Suspense>
</ErrorBoundary>

ใช้ use() เฉพาะในคอมโพเนนต์ฝั่งไคลเอนต์

การใช้ use() กับ Promise ทำงานได้ในคอมโพเนนต์ฝั่งไคลเอนต์ ส่วนคอมโพเนนต์ฝั่งเซิร์ฟเวอร์ให้ใช้ async/await โดยตรง ไม่จำเป็นต้องใช้ use() กับ Promise บนเซิร์ฟเวอร์

การแคช Promise

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

การสตรีมด้วย use()

การใช้ use() ร่วมกับ SSR แบบสตรีมมิงช่วยให้ React สตรีม HTML ของหน้า แสดงเนื้อหาสำรองของ Suspense แล้วสตรีมเนื้อหาที่เสร็จสมบูรณ์เมื่อ Promise เสร็จสิ้น ทั้งหมดนี้เกิดขึ้นภายในการเชื่อมต่อ HTTP เดียว

React.cache() สำหรับการลดการเรียกซ้ำ

บนเซิร์ฟเวอร์ React.cache() (หรือ unstable_cache ของ Next.js) จะลดการเรียกใช้ฟังก์ชันแบบ async เดียวกันซ้ำหลายครั้งภายในการเรนเดอร์ครั้งเดียว ดังนั้นฐานข้อมูลจะถูกเรียกเพียงครั้งเดียว แม้ว่าจะมีคอมโพเนนต์หลายตัวใช้ promise เดียวกันก็ตาม

ตรวจสอบความเข้าใจอย่างรวดเร็ว

เมื่อเรียกใช้(promise) ในคอมโพเนนต์ฝั่งไคลเอนต์และ promise ยังอยู่ในสถานะรอดำเนินการ จะเกิดอะไรขึ้น

สรุปทบทวน

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

ถัดไป

บทเรียนถัดไป: **React Actions และ useActionState** — คุณจะกำหนดแอ็กชันฝั่งเซิร์ฟเวอร์และฝั่งไคลเอนต์ รวมทั้งจัดการการส่งแบบฟอร์มด้วยสถานะรอดำเนินการ

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

บทเรียน “ฮุก use() สำหรับทรัพยากรแบบอะซิงก์” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “ฮุก use() สำหรับทรัพยากรแบบอะซิงก์”

อ่าน promise และ Context ระหว่างการเรนเดอร์ด้วยฮุก use() ใน React 19 คุณปฏิบัติ React Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

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

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

บทเรียน “ฮุก use() สำหรับทรัพยากรแบบอะซิงก์” ใช้เวลานานแค่ไหน

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

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

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

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

  1. ทำความเข้าใจ React Server Components
  2. ฮุก use() สำหรับทรัพยากรแบบอะซิงก์
  3. React Actions และ useActionState
  4. useOptimistic สำหรับการตอบสนองทันที
← กลับไปที่ React Academy