ก่อนที่ฉันจะพูดถึงรายละเอียดเกี่ยวกับวิธีที่คุณสามารถเข้าถึงสถานะขององค์ประกอบย่อยโปรดตรวจสอบให้แน่ใจว่าได้อ่านคำตอบของMarkus-ipseเกี่ยวกับวิธีแก้ปัญหาที่ดีกว่าเพื่อจัดการสถานการณ์นี้โดยเฉพาะ
หากคุณต้องการเข้าถึงสถานะของลูก ๆ ขององค์ประกอบคุณสามารถกำหนดคุณสมบัติที่เรียกref
ให้เด็กแต่ละคนได้ ขณะนี้มีสองวิธีในการใช้การอ้างอิง: การใช้React.createRef()
และการอ้างอิงกลับ
การใช้ React.createRef()
ปัจจุบันนี้เป็นวิธีที่แนะนำให้ใช้การอ้างอิงตั้งแต่ React 16.3 (ดูเอกสารสำหรับข้อมูลเพิ่มเติม) หากคุณใช้รุ่นก่อนหน้าโปรดดูด้านล่างเกี่ยวกับการอ้างอิงการโทรกลับ
คุณจะต้องสร้างการอ้างอิงใหม่ในตัวสร้างขององค์ประกอบหลักของคุณแล้วกำหนดให้เด็กผ่านทางref
แอตทริบิวต์
class FormEditor extends React.Component {
constructor(props) {
super(props);
this.FieldEditor1 = React.createRef();
}
render() {
return <FieldEditor ref={this.FieldEditor1} />;
}
}
ในการเข้าถึงการอ้างอิงประเภทนี้คุณจะต้องใช้:
const currentFieldEditor1 = this.FieldEditor1.current;
นี่จะส่งคืนอินสแตนซ์ของคอมโพเนนต์ที่เมาท์ดังนั้นคุณจึงสามารถใช้currentFieldEditor1.state
เพื่อเข้าถึงสถานะ
เพียงบันทึกย่อที่จะบอกว่าถ้าคุณใช้การอ้างอิงเหล่านี้บนโหนด DOM แทนองค์ประกอบ (เช่น<div ref={this.divRef} />
) จากนั้นthis.divRef.current
จะส่งคืนองค์ประกอบ DOM พื้นฐานแทนอินสแตนซ์องค์ประกอบ
Refs โทรกลับ
คุณสมบัตินี้รับฟังก์ชั่นการโทรกลับที่ส่งผ่านการอ้างอิงถึงองค์ประกอบที่แนบมา การเรียกกลับนี้จะดำเนินการทันทีหลังจากส่วนประกอบถูกเมานท์หรือถอดออก
ตัวอย่างเช่น:
<FieldEditor
ref={(fieldEditor1) => {this.fieldEditor1 = fieldEditor1;}
{...props}
/>
ในตัวอย่างเหล่านี้การอ้างอิงจะถูกเก็บไว้ในองค์ประกอบหลัก ในการเรียกส่วนนี้ในรหัสของคุณคุณสามารถใช้:
this.fieldEditor1
แล้วใช้this.fieldEditor1.state
เพื่อรับสถานะ
สิ่งหนึ่งที่ควรทราบตรวจสอบให้แน่ใจว่าองค์ประกอบลูกของคุณแสดงผลแล้วก่อนที่คุณจะพยายามเข้าถึง ^ _ ^
ดังกล่าวข้างต้นหากคุณใช้การอ้างอิงเหล่านี้บนโหนด DOM แทนองค์ประกอบ (เช่น<div ref={(divRef) => {this.myDiv = divRef;}} />
) จากนั้นthis.divRef
จะส่งคืนองค์ประกอบ DOM พื้นฐานแทนอินสแตนซ์ขององค์ประกอบ
ข้อมูลเพิ่มเติม
หากคุณต้องการอ่านเพิ่มเติมเกี่ยวกับคุณสมบัติการอ้างอิงของ React ให้ตรวจสอบหน้านี้จาก Facebook
ตรวจสอบให้แน่ใจว่าคุณอ่านหัวข้อ " อย่าใช้มากจนเกินไป " ที่ระบุว่าคุณไม่ควรใช้เด็กstate
เพื่อ "ทำให้สิ่งต่าง ๆ เกิดขึ้น"
หวังว่านี่จะช่วยได้ ^ _ ^
แก้ไข: เพิ่มReact.createRef()
วิธีการสร้างการอ้างอิง ลบรหัส ES5