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

แนวทางปฏิบัติที่ดีสำหรับ Key และ Ref

ใช้คีย์ที่คงที่ หลีกเลี่ยงปัญหาจากการใช้ดัชนีเป็นคีย์ และทำงานกับ callback refs

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

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

ในบทเรียนนี้ คุณจะได้เรียนรู้วิธีใช้คีย์ของรายการอย่างถูกต้อง เหตุใดการใช้ดัชนีอาร์เรย์เป็นคีย์จึงทำให้เกิดข้อบกพร่อง และวิธีทำงานกับการอ้างอิงแบบเรียกกลับและการอ้างอิงที่ส่งต่อ

เหตุใดคีย์จึงสำคัญ

React ใช้พร็อพ `key` เพื่อติดตามว่ารายการใดในรายการเปลี่ยน ถูกเพิ่ม หรือถูกลบระหว่างการ render คีย์ที่ถูกต้องทำให้ React นำโหนด DOM ที่มีอยู่กลับมาใช้ได้ ส่วนคีย์ที่ไม่ถูกต้องจะทำให้เกิดการถอดเมานต์และเมานต์ใหม่โดยไม่จำเป็น

คีย์ที่คงที่และไม่ซ้ำกัน

คีย์ที่ดีที่สุดคือ ID ที่คงที่และไม่ซ้ำกันจากข้อมูลของคุณ เช่น ID ของแถวในฐานข้อมูลหรือ UUID คีย์นี้ต้องไม่ซ้ำกันเฉพาะในกลุ่มองค์ประกอบพี่น้องเท่านั้น ไม่จำเป็นต้องไม่ซ้ำกันทั่วทั้งหน้า
users.map(user => (
  <UserCard key={user.id} user={user} />
))

เหตุใดการใช้ดัชนีเป็นคีย์จึงมีปัญหา

การใช้ดัชนีอาร์เรย์เป็นคีย์ทำงานได้ดีสำหรับรายการแบบคงที่ แต่ทำให้เกิดข้อบกพร่องในรายการที่เรียงลำดับหรือกรองได้ เมื่อรายการมีการเรียงใหม่ React จะจับคู่คอมโพเนนต์ตามดัชนีและนำโหนด DOM ที่ไม่ถูกต้องกลับมาใช้ ทำให้ค่าของอินพุตและสถานะภาพเคลื่อนไหวเสียหาย
// Risky when list can reorder or filter
items.map((item, i) => <Row key={i} {...item} />)

กรณีที่ยอมรับการใช้ดัชนีเป็นคีย์

การใช้ดัชนีเป็นคีย์ยอมรับได้เฉพาะเมื่อ: (1) รายการไม่มีการเรียงใหม่หรือกรอง (2) รายการไม่มี ID ที่คงที่ และ (3) รายการไม่มีสถานะภายใน เช่น ค่าของอินพุต รายการแสดงผลแบบคงที่สามารถใช้ได้

การสร้าง ID ที่คงที่

หากข้อมูลของคุณไม่มี ID ให้สร้าง ID เมื่อสร้างรายการ (ไม่ใช่ระหว่างการ render) คุณสามารถใช้ `crypto.randomUUID()` หรือไลบรารี `nanoid` ได้
const newItem = { id: crypto.randomUUID(), text: 'Buy milk' };

พื้นฐานของ useRef

`useRef` จะส่งคืนออบเจ็กต์ที่แก้ไขได้ ซึ่งค่า `.current` จะคงอยู่ข้ามการ render โดยไม่ทำให้เกิดการ render ใหม่ ใช้สำหรับเก็บการอ้างอิง DOM และค่าที่แก้ไขได้ เช่น ID ของตัวจับเวลา
const inputRef = useRef(null);
<input ref={inputRef} />
// Access DOM node: inputRef.current.focus();

การอ้างอิงแบบเรียกกลับ

แทนที่จะส่งออบเจ็กต์การอ้างอิง คุณสามารถส่ง **การอ้างอิงแบบเรียกกลับ** ซึ่งเป็นฟังก์ชันที่ React เรียกใช้พร้อมโหนด DOM เมื่อโหนดนั้นเมานต์ และเรียกใช้พร้อม `null` เมื่อโหนดถูกถอดเมานต์ วิธีนี้ทำให้คุณตั้งค่าตรรกะได้ตรงเวลาที่โหนดพร้อมใช้งาน
function Input() {
  return (
    <input
      ref={node => {
        if (node) node.focus();
      }}
    />
  );
}

forwardRef สำหรับการอ้างอิงคอมโพเนนต์

คอมโพเนนต์ฟังก์ชันไม่รับ `ref` เป็นพร็อพปกติ ให้ครอบคอมโพเนนต์ด้วย `React.forwardRef` เพื่อให้คอมโพเนนต์แม่แนบการอ้างอิงเข้ากับโหนด DOM ภายในได้
const FancyInput = React.forwardRef((props, ref) => (
  <input ref={ref} className="fancy" {...props} />
));

// Parent
const inputRef = useRef(null);
<FancyInput ref={inputRef} />

useImperativeHandle

เมื่อคอมโพเนนต์แม่ถือการอ้างอิงไปยังคอมโพเนนต์ลูก คุณสามารถควบคุมสิ่งที่คอมโพเนนต์ลูกเปิดเผยได้อย่างละเอียดโดยใช้ `useImperativeHandle` วิธีนี้ช่วยเก็บ DOM ภายในของคอมโพเนนต์ลูกไว้เป็นส่วนตัว พร้อมมอบเอพีไอเชิง命令ที่สะอาดให้ใช้งาน
const Child = forwardRef((_, ref) => {
  const innerRef = useRef();
  useImperativeHandle(ref, () => ({
    focus: () => innerRef.current.focus(),
  }));
  return <input ref={innerRef} />;
});

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

เหตุใดคุณจึงควรหลีกเลี่ยงการใช้ดัชนีอาร์เรย์เป็นคีย์ในรายการที่สามารถเรียงใหม่ได้

สรุป

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

ถัดไป

บทเรียนถัดไป: **โครงสร้างโฟลเดอร์และหลักเกณฑ์การตั้งชื่อ** — คุณจะจัดระเบียบโครงการ React ด้วยโฟลเดอร์ตามฟีเจอร์และการตั้งชื่อไฟล์อย่างสอดคล้องกัน

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

บทเรียน “แนวทางปฏิบัติที่ดีสำหรับ Key และ Ref” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “แนวทางปฏิบัติที่ดีสำหรับ Key และ Ref”

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

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

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

บทเรียน “แนวทางปฏิบัติที่ดีสำหรับ Key และ Ref” ใช้เวลานานแค่ไหน

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

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

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

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

  1. StrictMode ทำอะไร
  2. คอมโพเนนต์บริสุทธิ์และการหลีกเลี่ยงผลข้างเคียงในการเรนเดอร์
  3. แนวทางปฏิบัติที่ดีสำหรับ Key และ Ref
  4. โครงสร้างโฟลเดอร์และหลักการตั้งชื่อ
← กลับไปที่ React Academy