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

การดึงข้อมูลเมื่อเมานต์

ดึง JSON จาก API ภายใน useEffect เก็บการตอบกลับไว้ในสถานะ และเรียกการดึงข้อมูลเพียงครั้งเดียวด้วยอาร์เรย์ dependency ว่าง

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

รูปแบบการดึงข้อมูล

รูปแบบมาตรฐานสำหรับการดึงข้อมูลใน React คือ: 1) กำหนดสถานะกำลังโหลด ข้อผิดพลาด และข้อมูล 2) ดึงข้อมูลใน useEffect โดยใช้อาร์เรย์การพึ่งพาที่ว่างเปล่า [] 3) อัปเดตสถานะในฟังก์ชันเรียกกลับ 4) แสดงผลตามสถานะ

ตัวอย่างฉบับสมบูรณ์

ตัวอย่างฉบับสมบูรณ์ที่ดึงข้อมูลผู้ใช้เมื่อเมานต์ พร้อมการจัดการสถานะกำลังโหลดและข้อผิดพลาด

interface User { id: number; name: string; email: string; }

function UserList() {
  const [users, setUsers] = useState<User[]>([]);
  const [loading, setLoading] = useState(true);
  const [error, setError] = useState<string | null>(null);

  useEffect(() => {
    fetch('/api/users')
      .then(res => {
        if (!res.ok) throw new Error(`HTTP ${res.status}`);
        return res.json();
      })
      .then(data => setUsers(data))
      .catch(err => setError(err.message))
      .finally(() => setLoading(false));
  }, []);

  if (loading) return <Spinner />;
  if (error)   return <ErrorMessage message={error} />;
  return <ul>{users.map(u => <UserItem key={u.id} {...u} />)}</ul>;
}

การใช้ async/await ใน useEffect

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

useEffect(() => {
  async function fetchUsers() {
    try {
      const res = await fetch('/api/users');
      if (!res.ok) throw new Error(`HTTP ${res.status}`);
      const data = await res.json();
      setUsers(data);
    } catch (err) {
      setError((err as Error).message);
    } finally {
      setLoading(false);
    }
  }

  fetchUsers();
}, []);

การตรวจสอบสถานะการตอบกลับ

fetch จะไม่ส่งข้อผิดพลาดออกมาสำหรับข้อผิดพลาด HTTP (4xx, 5xx) แต่จะส่งออกมาเฉพาะเมื่อเครือข่ายล้มเหลวเท่านั้น ให้ตรวจสอบ response.ok เสมอ และส่งข้อผิดพลาดออกมาเองสำหรับการตอบกลับที่มีข้อผิดพลาด

const res = await fetch('/api/data');
if (!res.ok) {
  // Could also use res.status for specific handling
  throw new Error(`Server responded ${res.status}: ${res.statusText}`);
}
const data = await res.json();

การดึงข้อมูลเมื่อการพึ่งพาเปลี่ยนแปลง

เพิ่มการพึ่งพา เช่น ID จากพารามิเตอร์เส้นทางหรือพร็อพ ลงในอาร์เรย์การพึ่งพาของผลข้างเคียง ผลข้างเคียงจะทำงานอีกครั้งและดึงข้อมูลล่าสุดทุกครั้งที่การพึ่งพาเปลี่ยนแปลง

const { userId } = useParams();

useEffect(() => {
  if (!userId) return;
  setLoading(true);
  fetch(`/api/users/${userId}`)
    .then(r => r.json())
    .then(setUser)
    .finally(() => setLoading(false));
}, [userId]);

คำขอ POST ในผลข้างเคียง

ผลข้างเคียงสามารถส่งคำขอ POST/PUT/DELETE ได้เช่นกัน แต่โดยปกติคำขอเหล่านี้ควรถูกเรียกใช้จากเหตุการณ์ เช่น การส่งแบบฟอร์มหรือการคลิกปุ่ม ไม่ใช่จากผลข้างเคียงเมื่อเมานต์ ให้ใช้ผลข้างเคียงสำหรับการโหลดข้อมูล และใช้ตัวจัดการเหตุการณ์สำหรับการเปลี่ยนแปลงข้อมูล

ฮุก useFetch แบบกำหนดเอง

แยกรูปแบบการดึงข้อมูล + กำลังโหลด + ข้อผิดพลาดออกมาเป็นฮุกแบบกำหนดเอง เพื่อใช้ซ้ำในองค์ประกอบต่าง ๆ

function useFetch<T>(url: string) {
  const [data, setData] = useState<T | null>(null);
  const [loading, setLoading] = useState(true);
  const [error, setError] = useState<string | null>(null);

  useEffect(() => {
    setLoading(true);
    fetch(url)
      .then(r => { if (!r.ok) throw new Error(`${r.status}`); return r.json(); })
      .then(setData)
      .catch(e => setError(e.message))
      .finally(() => setLoading(false));
  }, [url]);

  return { data, loading, error };
}

การแยกวิเคราะห์ JSON อย่างปลอดภัย

ครอบ res.json() ด้วย try/catch เสมอ เพราะ JSON ที่มีรูปแบบไม่ถูกต้องจะส่ง SyntaxError ออกมา catch ด้านนอกจะจัดการให้ แต่การทราบแหล่งที่มาจะช่วยในการแก้ไขข้อผิดพลาด

การกำหนดค่า URL พื้นฐานของ API

อย่าฝัง URL ของ API ไว้ในโค้ด ให้ใช้ตัวแปรสภาพแวดล้อม (import.meta.env.VITE_API_URL) สำหรับ URL พื้นฐาน สร้างไฟล์ api.ts ส่วนกลางพร้อมตัวห่อหุ้ม fetch ที่กำหนดค่าไว้

const API_BASE = import.meta.env.VITE_API_URL;

async function apiFetch<T>(path: string): Promise<T> {
  const res = await fetch(`${API_BASE}${path}`, {
    headers: { 'Authorization': `Bearer ${getToken()}` }
  });
  if (!res.ok) throw new Error(`API error ${res.status}`);
  return res.json();
}

เมื่อใดควรเปลี่ยนไปใช้ React Query

รูปแบบการดึงข้อมูลด้วยตนเองเหมาะกับกรณีง่าย ๆ เมื่อคุณต้องการการแคช การดึงข้อมูลใหม่เบื้องหลัง การแบ่งหน้า หรือการเปลี่ยนแปลงข้อมูล ให้เปลี่ยนไปใช้ React Query (TanStack Query) ซึ่งจัดการรูปแบบเหล่านี้ได้อย่างน่าเชื่อถือ

การแสดงโครงร่างขณะโหลด

แทนที่จะแสดงวงล้อ ให้แสดงส่วนติดต่อผู้ใช้แบบโครงร่างที่มีรูปร่างสอดคล้องกับเนื้อหาที่โหลดแล้ว วิธีนี้ช่วยลดเวลาการโหลดที่ผู้ใช้รับรู้และป้องกันการขยับของเค้าโครง

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

เหตุใดจึงทำให้ฟังก์ชันเรียกกลับของ useEffect เป็น async โดยตรงไม่ได้

สรุป: การดึงข้อมูลใน useEffect

กำหนดสถานะกำลังโหลด ข้อผิดพลาด และข้อมูล ดึงข้อมูลใน useEffect ด้วยอาร์เรย์การพึ่งพาที่ว่างเปล่า [] กำหนดฟังก์ชัน async ภายใน แต่อย่าทำให้ฟังก์ชันเรียกกลับเป็น async ตรวจสอบ res.ok เสมอ เพิ่ม URL หรือ ID ลงในอาร์เรย์การพึ่งพาสำหรับการดึงข้อมูลแบบไดนามิก แยกเป็นฮุก useFetch แบบกำหนดเองเพื่อใช้ซ้ำ และพิจารณาใช้ TanStack Query สำหรับการดึงข้อมูลในระบบจริง

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

บทเรียน “การดึงข้อมูลเมื่อเมานต์” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “การดึงข้อมูลเมื่อเมานต์”

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

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

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

บทเรียน “การดึงข้อมูลเมื่อเมานต์” ใช้เวลานานแค่ไหน

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

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

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

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

  1. พื้นฐาน useEffect: dependencies และการทำความสะอาด
  2. การดึงข้อมูลเมื่อเมานต์
  3. การจัดการสถานะกำลังโหลดและข้อผิดพลาด
  4. AbortController สำหรับการทำความสะอาด
← กลับไปที่ Frontend Academy