ส่วนประกอบที่ควบคุมด้วยปฏิกิริยาและส่วนประกอบที่ไม่มีการควบคุมคืออะไร?


108

ส่วนประกอบที่ควบคุมและส่วนประกอบที่ไม่มีการควบคุมใน ReactJS คืออะไร? พวกเขาแตกต่างจากกันอย่างไร?


23
เสนอชื่อเพื่อเปิดใหม่ เป็นคำถามที่ค่อนข้างแม่นยำ ไม่แน่ใจว่าจะถือว่ากว้างเกินไปได้อย่างไร
Charlie Flowers

คำตอบ:


135

สิ่งนี้เกี่ยวข้องกับส่วนประกอบ DOM ที่มีสถานะ (องค์ประกอบฟอร์ม) และเอกสาร React อธิบายความแตกต่าง:

  • ตัวแทนควบคุมเป็นสิ่งหนึ่งที่ต้องใช้ค่าปัจจุบันผ่านและแจ้งการเปลี่ยนแปลงผ่านการเรียกกลับเช่นprops onChangeองค์ประกอบหลัก "ควบคุม" โดยจัดการการเรียกกลับและจัดการสถานะของตัวเองและส่งผ่านค่าใหม่เป็นอุปกรณ์ประกอบฉากไปยังส่วนประกอบที่ควบคุม คุณสามารถเรียกสิ่งนี้ว่า "องค์ประกอบใบ้" ก็ได้
  • ไม่มีการควบคุมตัวแทนเป็นหนึ่งในร้านค้าที่รัฐของตัวเองภายในและคุณสอบถาม DOM ใช้refเพื่อหามูลค่าปัจจุบันเมื่อคุณต้องการมัน ซึ่งคล้ายกับ HTML แบบเดิมเล็กน้อย

ส่วนประกอบรูปแบบการตอบสนองดั้งเดิมส่วนใหญ่รองรับการใช้งานทั้งแบบควบคุมและไม่มีการควบคุม:

// Controlled:
<input type="text" value={value} onChange={handleChange} />

// Uncontrolled:
<input type="text" defaultValue="foo" ref={inputRef} />
// Use `inputRef.current.value` to read the current value of <input>

ในที่สุด (หรือทั้งหมด) กรณีที่คุณควรใช้ส่วนประกอบควบคุม


1
ค่าถูกนำมาใช้stateมากกว่าไม่ใช่propsหรือ
Ivanka Todorova

9
@IvankaTodorova propsสำหรับองค์ประกอบการควบคุมค่าจะถูกส่งผ่าน ส่วนประกอบที่ไม่มีการควบคุมจะใช้stateเพื่อควบคุมค่าภายใน นี่คือความแตกต่างที่สำคัญ
Aaron Beall

1
ความแตกต่างระหว่างองค์ประกอบเหล่านี้คือส่วนประกอบที่ตั้งค่า / ส่งผ่านและมีการเรียกกลับเรียกว่าcontrolled components( <input type="text" value="value" onChange={handleChangeCallbackFn} />) เทียบกับ HTML แบบดั้งเดิมโดยที่องค์ประกอบอินพุตจัดการกับค่าของตนเองและสามารถอ่านได้ผ่านทางที่refsเรียกว่าuncontrolled components( <value type="text" />) ส่วนประกอบที่ควบคุมกำลังจัดการสถานะของตนเองผ่านsetStateหรือรับจากส่วนประกอบหลักเป็นอุปกรณ์ประกอบฉาก
Lior Elrom

คุณจะเรียกส่วนประกอบที่ได้รับdefaultValueผ่านอุปกรณ์ประกอบฉากได้อย่างไร แต่จะแจ้งให้คอนโทรลเลอร์ทราบonBlurอย่างไร
Paul Razvan Berg

@PaulRazvanBerg ที่เสียงเหมือนการต่อต้านรูปแบบรัฐควรมีการควบคุมในสถานที่เดียว โดยปกติคุณจะยกสถานะเป็นบรรพบุรุษร่วมที่ใกล้เคียงที่สุด
Aaron Beall

1
  • ส่วนประกอบที่ควบคุมจะแจ้งส่วนประกอบอื่น ๆ เกี่ยวกับการเปลี่ยนแปลงโดยใช้การโทรกลับ ตัวอย่างเช่น: <Button onClick={() => console.log("clicked")}>Click</Button>.
  • ส่วนประกอบที่ไม่มีการควบคุมจะไม่แจ้งส่วนประกอบอื่น ๆ เกี่ยวกับการเปลี่ยนแปลงและคุณสามารถเข้าถึงส่วนประกอบได้โดยใช้ ref-s เท่านั้น การอ้างอิงอาจมีประโยชน์หากคุณต้องการเข้าถึงองค์ประกอบ HTML ที่แท้จริง

1

ส่วนประกอบที่ควบคุมเป็นส่วนประกอบที่ได้รับค่าที่เปลี่ยนแปลงจากฟังก์ชันการเรียกกลับและส่วนประกอบที่ไม่มีการควบคุมเป็นส่วนประกอบที่มีจาก DOM ตัวอย่างเช่นเมื่อค่าอินพุตมีการเปลี่ยนแปลงเราสามารถใช้ฟังก์ชัน onChange ใน Controlled Component และเราสามารถรับค่าโดยใช้ DOM เช่น ref

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.