การดึงข้อมูลเมื่อเมานต์
ดึง 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- พื้นฐาน useEffect: dependencies และการทำความสะอาด
- การดึงข้อมูลเมื่อเมานต์
- การจัดการสถานะกำลังโหลดและข้อผิดพลาด
- AbortController สำหรับการทำความสะอาด