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

การแก้ไขข้อผิดพลาด React ที่พบบ่อย

วิเคราะห์คำเตือนคีย์หาย ข้อผิดพลาดจากสถานะที่ไม่กำหนดค่า และข้อผิดพลาดระหว่างการเติมข้อมูล

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

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

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

คำเตือนเกี่ยวกับคีย์ที่หายไป

React บันทึกข้อความว่า: *องค์ประกอบลูกแต่ละรายการในรายการควรมีพร็อพ "คีย์" ที่ไม่ซ้ำกัน* ปัญหานี้เกิดขึ้นเมื่อคุณ render อาร์เรย์โดยไม่ได้เพิ่มพร็อพ `key` แก้ไขโดยเพิ่มคีย์ที่คงที่และไม่ซ้ำกันให้กับรายการแต่ละรายการ
// Bad
items.map(item => <li>{item.name}</li>)

// Good
items.map(item => <li key={item.id}>{item.name}</li>)

ไม่สามารถอ่านคุณสมบัติของค่าที่ไม่ได้กำหนด

ข้อขัดข้องนี้มักหมายความว่าสถานะของคุณเป็น `undefined` ในการ render ครั้งแรก ให้กำหนดค่าเริ่มต้นที่ปลอดภัยให้สถานะเสมอ (`[]` สำหรับอาร์เรย์ `{}` สำหรับออบเจ็กต์ และ `null` สำหรับค่าที่คุณตรวจสอบก่อนใช้งาน)
// Bad — crashes if data is undefined
const [data, setData] = useState();
return <p>{data.name}</p>;

// Good
const [data, setData] = useState(null);
return data ? <p>{data.name}</p> : <p>Loading...</p>;

ข้อผิดพลาดจากการ render ใหม่มากเกินไป

React จะแจ้งข้อผิดพลาด *การ render ใหม่มากเกินไป* เมื่อคอมโพเนนต์เข้าสู่วงจรการ render ไม่สิ้นสุด ซึ่งมักเกิดจากการเรียก `setState` โดยไม่มีเงื่อนไขระหว่างการ render หรือส่ง `() => setState(...)` ที่เขียนไว้โดยตรงเป็นพร็อพ ซึ่งจะทำงานในการ render ทุกครั้ง
// Bad — setState called on every render
function Counter() {
  const [n, setN] = useState(0);
  setN(n + 1); // infinite loop!
  return <p>{n}</p>;
}

แก้ไขการ render ใหม่มากเกินไป

ย้ายการอัปเดตสถานะไปไว้ในตัวจัดการเหตุการณ์หรือ useEffect อย่าเรียก setState โดยตรงที่ระดับบนสุดของเนื้อหาคอมโพเนนต์
// Good — update only on click
function Counter() {
  const [n, setN] = useState(0);
  return <button onClick={() => setN(n + 1)}>{n}</button>;
}

คำเตือนความไม่ตรงกันของการเติมข้อมูล

ในแอป SSR React จะแจ้งเตือนว่า *การเติมข้อมูลล้มเหลว เนื่องจากส่วนติดต่อผู้ใช้เริ่มต้นไม่ตรงกับสิ่งที่ render บนเซิร์ฟเวอร์* สาเหตุที่พบบ่อย ได้แก่ การใช้ `Date.now()` หรือ `Math.random()` ในการ render หรือส่วนขยายเบราว์เซอร์แทรก HTML

แก้ไขความไม่ตรงกันของการเติมข้อมูล

ย้ายค่าแบบไดนามิก (การประทับเวลาและ ID แบบสุ่ม) ไปไว้ใน `useState` ที่กำหนดค่าเริ่มต้นภายใน useEffect เพื่อให้เซิร์ฟเวอร์ render ค่าคงที่เสมอ และไคลเอนต์อัปเดตค่าหลังเมานต์
const [ts, setTs] = useState('');
useEffect(() => {
  setTs(Date.now().toString());
}, []);
return <p>{ts}</p>;

สถานะไม่อัปเดตทันที

โปรดจำไว้ว่า `setState` ทำงานแบบไม่พร้อมกัน การบันทึกสถานะทันทีหลังเรียกใช้จะแสดงค่าเก่า หากต้องการดูค่าที่อัปเดตแล้ว ให้บันทึกค่าภายใน useEffect ที่มีตัวแปรสถานะเป็นการพึ่งพา
const [count, setCount] = useState(0);

function handleClick() {
  setCount(count + 1);
  console.log(count); // still old value!
}

useEffect(() => {
  console.log('updated:', count); // correct
}, [count]);

คอมโพเนนต์ไม่อัปเดตเมื่อพร็อพส์เปลี่ยน

หากคอมโพเนนต์ไม่อัปเดตเมื่อพร็อพส์เปลี่ยน ให้ตรวจสอบว่าคุณไม่ได้แก้ไขออบเจ็กต์หรืออาร์เรย์โดยตรง ปฏิกิริยาใช้การเปรียบเทียบการอ้างอิง การแก้ไขออบเจ็กต์เดิมจะไม่ทำให้เกิดการ render ใหม่
// Bad — same reference, no re-render
const list = [];
list.push('item');
setList(list);

// Good — new array reference
setList([...list, 'item']);

การอ่านข้อผิดพลาดในหน้าซ้อนทับข้อผิดพลาด

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

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

สาเหตุที่พบบ่อยที่สุดของข้อผิดพลาด React เรื่อง 'การ render ใหม่มากเกินไป' คืออะไร

สรุป

ขณะนี้คุณสามารถแก้ไขข้อผิดพลาด React ที่พบบ่อยที่สุดได้แล้ว ได้แก่ เพิ่มคีย์ที่คงที่ให้รายการ กำหนดค่าเริ่มต้นของสถานะอย่างปลอดภัย หลีกเลี่ยงการใช้ setState ในการ render จัดการความไม่ตรงกันของการเติมข้อมูล และอ่านสแตกคอมโพเนนต์ในหน้าซ้อนทับข้อผิดพลาด

จบหลักสูตร

ขอแสดงความยินดี! คุณเรียน **React DevTools และการแก้ไขข้อบกพร่อง** จบแล้ว ขณะนี้คุณสามารถติดตั้ง DevTools ตรวจสอบแผนผังคอมโพเนนต์และสถานะ สร้างโปรไฟล์การ render และวินิจฉัยข้อผิดพลาดขณะทำงานของ React ที่พบบ่อยที่สุดได้

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

บทเรียน “การแก้ไขข้อผิดพลาด React ที่พบบ่อย” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “การแก้ไขข้อผิดพลาด React ที่พบบ่อย”

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

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

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

บทเรียน “การแก้ไขข้อผิดพลาด React ที่พบบ่อย” ใช้เวลานานแค่ไหน

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

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

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

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

  1. การติดตั้งและเปิด React DevTools
  2. การตรวจสอบโครงสร้างคอมโพเนนต์และพร็อพส์
  3. การใช้แท็บ Profiler
  4. การแก้ไขข้อผิดพลาด React ที่พบบ่อย
← กลับไปที่ React Academy