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

ยูทิลิตี React.Children

ใช้ React.Children.map, count และ toArray เพื่อจัดการ children อย่างปลอดภัย

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

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

ในบทเรียนนี้ คุณจะใช้ยูทิลิตี React.Children ได้แก่ map, count, toArray และ forEach เพื่อวนซ้ำและแปลงองค์ประกอบลูกอย่างปลอดภัย โดยไม่ขึ้นกับจำนวนองค์ประกอบลูกที่ส่งเข้ามา

ปัญหาของเมธอดอาร์เรย์โดยตรง

เนื่องจาก `props.children` อาจเป็นองค์ประกอบเดียว อาร์เรย์ หรือไม่ได้กำหนดค่า การเรียก `.map()` โดยตรงกับค่านี้จึงทำให้เกิดข้อผิดพลาด ยูทิลิตี React.Children รองรับทุกกรณีเหล่านี้อย่างปลอดภัย
// Unsafe — crashes if children is a single element
children.map(c => ...);

// Safe
React.Children.map(children, c => ...);

React.Children.map

ทำงานคล้าย `Array.prototype.map` แต่รองรับองค์ประกอบลูกเดี่ยว องค์ประกอบลูกหลายรายการ และค่า null/undefined ได้อย่างปลอดภัย โดยคืนค่าเป็นอาร์เรย์ขององค์ประกอบที่โคลน หรือค่าที่ฟังก์ชันเรียกกลับคืนมา
function List({ children }) {
  return (
    <ul>
      {React.Children.map(children, (child, i) => (
        <li key={i}>{child}</li>
      ))}
    </ul>
  );
}

React.Children.count

`React.Children.count(children)` คืนค่าจำนวนองค์ประกอบลูก โดยนับองค์ประกอบเดี่ยวเป็น 1 และนับ null/undefined เป็น 0 ได้อย่างถูกต้อง
function RequiresTwo({ children }) {
  if (React.Children.count(children) !== 2) {
    throw new Error('Exactly two children required');
  }
  return <div>{children}</div>;
}

React.Children.toArray

แปลงองค์ประกอบลูกเป็นอาร์เรย์แบนที่มีคีย์คงที่ ทำให้คุณสามารถเรียงลำดับ ใช้ filter หรือใช้ slice กับองค์ประกอบลูกด้วยเมธอดอาร์เรย์ทั่วไปได้ โดยไม่ต้องกังวลเรื่องการซ้อนกัน
function Reversed({ children }) {
  const arr = React.Children.toArray(children);
  return <>{arr.reverse()}</>;
}

React.Children.forEach

ทำงานคล้าย `.map()` แต่ไม่คืนค่า ใช้เมธอดนี้เมื่อต้องการวนซ้ำองค์ประกอบลูกเพื่อให้เกิดผลข้างเคียง เช่น ตรวจสอบชนิดขององค์ประกอบหรือสร้างตารางค้นหา
React.Children.forEach(children, child => {
  if (!React.isValidElement(child)) {
    console.warn('Non-element child found');
  }
});

React.Children.only

`React.Children.only(children)` ยืนยันว่ามีองค์ประกอบลูกเพียงหนึ่งรายการพอดีและคืนค่าองค์ประกอบนั้น หากมีองค์ประกอบลูกเป็นศูนย์หรือมากกว่าหนึ่งรายการ เมธอดนี้จะส่งข้อผิดพลาด เหมาะสำหรับบังคับใช้ส่วนติดต่อที่รับองค์ประกอบลูกเพียงรายการเดียว
function SingleChild({ children }) {
  const child = React.Children.only(children);
  return React.cloneElement(child, { 'data-wrapped': true });
}

การตรวจสอบชนิดขององค์ประกอบลูก

ใช้ `React.Children.forEach` ร่วมกับ `React.isValidElement` และชนิดของ child เพื่อบังคับให้ส่งองค์ประกอบคอมโพเนนต์ที่กำหนดไว้เท่านั้นเข้ามาเป็นองค์ประกอบลูก
React.Children.forEach(children, child => {
  if (child.type !== TabPanel) {
    throw new Error('Only TabPanel children allowed');
  }
});

React.Children เทียบกับ Array.from

ใน React 18 ขึ้นไป องค์ประกอบลูกอาจเป็นโครงสร้างต้นไม้องค์ประกอบ React ที่ไม่ใช่อาร์เรย์ธรรมดา ควรใช้ React.Children แทน Array.from เสมอ เพื่อหลีกเลี่ยงกรณีขอบที่เกี่ยวข้องกับองค์ประกอบเดี่ยวและแฟรกเมนต์

ทางเลือกสมัยใหม่: ทำให้อาร์เรย์แบนด้วย toArray

หากต้องการแปลงข้อมูลที่ซับซ้อน ให้เรียก `React.Children.toArray(children)` ก่อนเพื่อรับอาร์เรย์แบนที่มีคีย์ จากนั้นจึงใช้เมธอดอาร์เรย์ทั่วไปกับอาร์เรย์นั้น
const items = React.Children.toArray(children);
const first = items[0];
const rest = items.slice(1);

ตรวจสอบความเข้าใจ

เมธอดใดของ React.Children ที่รองรับองค์ประกอบเดี่ยว อาร์เรย์ และองค์ประกอบลูกที่เป็น null/undefined ได้อย่างปลอดภัย คล้าย Array.map แต่มีความทนทานกว่า

สรุปทบทวน

ใช้ React.Children.map เพื่อวนซ้ำอย่างปลอดภัย ใช้ React.Children.count เพื่อตรวจสอบจำนวน ใช้ React.Children.toArray เพื่อใช้เมธอดอาร์เรย์ ใช้ React.Children.forEach เพื่อวนซ้ำและทำให้เกิดผลข้างเคียง และใช้ React.Children.only เพื่อยืนยันว่ามีองค์ประกอบลูกเพียงหนึ่งรายการพอดี

ถัดไป

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

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

บทเรียน “ยูทิลิตี React.Children” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “ยูทิลิตี React.Children”

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

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

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

บทเรียน “ยูทิลิตี React.Children” ใช้เวลานานแค่ไหน

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

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

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

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

  1. พื้นฐาน props.children
  2. ยูทิลิตี React.Children
  3. สล็อตที่ระบุชื่อผ่านพร็อพส์แบบออบเจ็กต์
  4. การโคลนและแทรกพร็อพส์ด้วย cloneElement
← กลับไปที่ React Academy