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

รูปแบบ Render Props

ส่งฟังก์ชันเป็น prop ซึ่งคืนค่า JSX เพื่อแบ่งปันพฤติกรรมโดยไม่ผูกติดกับ UI

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

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

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

พร็อพสำหรับการเรนเดอร์คืออะไร

พร็อพสำหรับการเรนเดอร์คือรูปแบบที่คอมโพเนนต์รับพร็อพซึ่งเป็นฟังก์ชัน คอมโพเนนต์จะเรียกใช้ฟังก์ชันนี้เพื่อสร้างเอาต์พุตที่จะแสดงผล ผู้เรียกใช้จะควบคุมส่วนติดต่อผู้ใช้ ส่วนคอมโพเนนต์จะจัดเตรียมพฤติกรรมให้
<DataProvider render={data => <UserCard user={data} />} />

ตัวอย่างพร็อพสำหรับการเรนเดอร์อย่างง่าย

คอมโพเนนต์ Toggle จะจัดการสถานะเปิดหรือปิด และเรียกใช้พร็อพสำหรับการเรนเดอร์พร้อมสถานะปัจจุบันและฟังก์ชันสลับสถานะ ผู้เรียกใช้จะเป็นผู้กำหนดวิธีแสดงผล
function Toggle({ render }) {
  const [on, setOn] = useState(false);
  return render(on, () => setOn(!on));
}

<Toggle render={(on, toggle) => (
  <button onClick={toggle}>{on ? 'Close' : 'Open'}</button>
)} />

ใช้ children เป็นพร็อพสำหรับการเรนเดอร์

แทนที่จะใช้พร็อพสำหรับการเรนเดอร์ที่มีชื่อ คุณสามารถใช้ `children` เป็นฟังก์ชันได้ ไลบรารีหลายแห่ง เช่น React Router v5 และ Formik ใช้รูปแบบนี้ ซึ่งบางครั้งเรียกว่า 'children เป็นฟังก์ชัน'
<Toggle>
  {(on, toggle) => (
    <div>
      {on && <Panel />}
      <button onClick={toggle}>Toggle</button>
    </div>
  )}
</Toggle>

ตัวติดตามตำแหน่งเมาส์

ตัวอย่างคลาสสิกของพร็อพสำหรับการเรนเดอร์คือคอมโพเนนต์ MouseTracker ซึ่งติดตามตำแหน่งเคอร์เซอร์และส่งตำแหน่งนั้นให้พร็อพสำหรับการเรนเดอร์ ผู้เรียกใช้รายใดก็สามารถแสดงตำแหน่งได้ตามต้องการ
function MouseTracker({ children }) {
  const [pos, setPos] = useState({ x: 0, y: 0 });
  return (
    <div onMouseMove={e => setPos({ x: e.clientX, y: e.clientY })}>
      {children(pos)}
    </div>
  );
}

พร็อพสำหรับการเรนเดอร์เทียบกับฮุกแบบกำหนดเอง

พร็อพสำหรับการเรนเดอร์เป็นรูปแบบหลักที่ใช้ก่อนมีฮุก ปัจจุบันฮุกแบบกำหนดเองทำหน้าที่เดียวกันได้อย่างเป็นระเบียบมากกว่า โดยฮุกจะส่งคืนข้อมูลและฟังก์ชัน แล้วคอมโพเนนต์จะนำไปใช้ใน JSX ของตนเอง ใน React สมัยใหม่มักแนะนำให้ใช้ฮุก
// Old: render props
<Mouse render={pos => <p>{pos.x}</p>} />

// Modern: custom hook
const pos = useMouse();
<p>{pos.x}</p>

เมื่อใดยังควรใช้พร็อพสำหรับการเรนเดอร์

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

คำเตือนด้านประสิทธิภาพ

การกำหนดพร็อพสำหรับการเรนเดอร์แบบเขียนไว้ภายในจะสร้างฟังก์ชันใหม่ทุกครั้งที่คอมโพเนนต์แม่แสดงผล ทำให้คอมโพเนนต์ลูกที่เป็น PureComponent/React.memo ไม่สามารถข้ามการแสดงผลซ้ำได้ ให้แยกฟังก์ชันพร็อพสำหรับการเรนเดอร์ออกไปไว้ในตัวแปรหรือเมธอดที่มีความเสถียร
// Avoid: new function every render
<Toggle render={pos => <Dot pos={pos} />} />

// Better: stable reference
const renderDot = pos => <Dot pos={pos} />;
<Toggle render={renderDot} />

การประกอบพร็อพสำหรับการเรนเดอร์

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

พร็อพสำหรับการเรนเดอร์ในไลบรารี

React Router v5 ใช้พร็อพสำหรับการเรนเดอร์กับ Route ส่วน Downshift, Formik และ React-Table ก็ใช้รูปแบบที่มีลักษณะคล้ายกันเช่นกัน การเข้าใจพร็อพสำหรับการเรนเดอร์จะช่วยให้คุณอ่านและแก้ไขข้อบกพร่องของโค้ดที่ใช้ไลบรารีเหล่านี้ได้

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

ข้อได้เปรียบหลักของรูปแบบพร็อพสำหรับการเรนเดอร์เมื่อเทียบกับการส่ง JSX แบบคงที่คืออะไร

สรุปทบทวน

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

บทถัดไป

บทเรียนถัดไป: **ทำความเข้าใจคอมโพเนนต์ลำดับสูง (HOC)** — คุณจะห่อหุ้มคอมโพเนนต์เพื่อแทรกพร็อพ ป้องกันเส้นทาง หรือเพิ่มการบันทึกการทำงาน

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

บทเรียน “รูปแบบ Render Props” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “รูปแบบ Render Props”

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

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

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

บทเรียน “รูปแบบ Render Props” ใช้เวลานานแค่ไหน

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

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

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

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

  1. รูปแบบ Render Props
  2. ทำความเข้าใจคอมโพเนนต์ลำดับสูง (HOC)
  3. HOC กับ Render Props และ Custom Hooks
  4. การปรับโครงสร้าง HOC เป็น Custom Hook
← กลับไปที่ React Academy