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

การโคลนและแทรกพร็อพส์ด้วย cloneElement

ใช้ React.cloneElement เพื่อส่งพร็อพส์ที่ซ่อนอยู่จากคอมโพเนนต์แม่ไปยังคอมโพเนนต์ลูก

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

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

ในบทเรียนนี้ คุณจะใช้ React.cloneElement เพื่อโคลนองค์ประกอบลูกและใส่พร็อพเพิ่มเติมจากคอมโพเนนต์แม่ โดยที่องค์ประกอบลูกไม่จำเป็นต้องรู้จักพร็อพเหล่านั้น

cloneElement คืออะไร

`React.cloneElement(element, props, ...children)` สร้างองค์ประกอบ React ใหม่โดยอิงจากองค์ประกอบเดิม พร้อมผสานพร็อพใหม่เข้ากับพร็อพเดิม ชนิดขององค์ประกอบเดิมจะยังคงเดิม
const clone = React.cloneElement(child, { active: true });

เหตุผลที่ใช้ cloneElement

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

ตัวอย่างแถบแท็บ

คอมโพเนนต์ Tabs สามารถโคลนองค์ประกอบลูก Tab แต่ละรายการ และใส่พร็อพ `isActive` กับ `onClick` ให้อัตโนมัติ ทำให้ผู้ใช้คอมโพเนนต์ไม่ต้องเชื่อมต่อพร็อพเหล่านี้ด้วยตนเอง
function Tabs({ children, activeIndex, onChange }) {
  return (
    <div className="tabs">
      {React.Children.map(children, (child, i) =>
        React.cloneElement(child, {
          isActive: i === activeIndex,
          onClick: () => onChange(i),
        })
      )}
    </div>
  );
}

กฎการผสานพร็อพ

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

การผสานตัวจัดการเหตุการณ์

หากต้องการผสานตัวจัดการเหตุการณ์แทนการเขียนทับ ให้รวมฟังก์ชันเรียกกลับด้วยตนเองก่อนส่งให้ cloneElement
React.cloneElement(child, {
  onClick: (e) => {
    child.props.onClick?.(e); // original handler
    handleClick(e);           // injected handler
  },
})

การแทนที่องค์ประกอบลูก

อาร์กิวเมนต์ตัวที่สามของ `cloneElement` จะแทนที่องค์ประกอบลูกขององค์ประกอบนั้น ให้ส่งเนื้อหาใหม่เพื่อแทนที่องค์ประกอบลูกเดิมทั้งหมด
// Replace children with wrapped version
React.cloneElement(child, {}, <strong>{child.props.children}</strong>)

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

ก่อนโคลน ให้ตรวจสอบว่าองค์ประกอบลูกเป็นองค์ประกอบ React ที่ถูกต้อง และตรวจสอบชนิดขององค์ประกอบเพิ่มเติมหากจำเป็น เพื่อหลีกเลี่ยงการโคลนสิ่งที่ไม่ใช่องค์ประกอบ เช่น ข้อความ ตัวเลข หรือค่าว่าง
if (React.isValidElement(child)) {
  return React.cloneElement(child, extraProps);
}
return child;

cloneElement เทียบกับบริบท

cloneElement เปราะบางเพราะต้องรู้โครงสร้างขององค์ประกอบลูก โดยทั่วไปควรใช้ Context มากกว่าสำหรับส่งข้อมูลโดยนัยผ่านหลายระดับ ใช้ cloneElement เฉพาะเมื่อต้องการใส่พร็อพจากคอมโพเนนต์แม่ให้กับองค์ประกอบลูกโดยตรง

ทางเลือกสมัยใหม่: พร็อพสำหรับเรนเดอร์และฮุก

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

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

จะเกิดอะไรขึ้นกับพร็อพที่มีอยู่ทั้งในองค์ประกอบเดิมและในออบเจ็กต์พร็อพที่ส่งให้ React.cloneElement

สรุปทบทวน

React.cloneElement จะโคลนองค์ประกอบและใส่พร็อพใหม่ ใช้สำหรับใส่พร็อพโดยนัยจากคอมโพเนนต์แม่ไปยังองค์ประกอบลูกในคอมโพเนนต์ประกอบ หากลำดับชั้นลึกกว่านั้น ควรใช้ Context หรือพร็อพสำหรับเรนเดอร์แทน

จบหลักสูตร

ยินดีด้วยครับ! คุณเรียนจบ **React Children API และรูปแบบสล็อต** แล้ว ตอนนี้คุณเชี่ยวชาญ props.children ยูทิลิตี React.Children พร็อพสล็อตที่มีชื่อ และ cloneElement สำหรับสร้างคอมโพเนนต์จัดวางโครงร่างที่ยืดหยุ่น

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

บทเรียน “การโคลนและแทรกพร็อพส์ด้วย cloneElement” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “การโคลนและแทรกพร็อพส์ด้วย cloneElement”

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

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

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

บทเรียน “การโคลนและแทรกพร็อพส์ด้วย cloneElement” ใช้เวลานานแค่ไหน

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

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

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

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

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