คุณสามารถใช้React.cloneElement
มันจะดีกว่าที่จะรู้ว่ามันทำงานอย่างไรก่อนที่คุณจะเริ่มใช้มันในแอปพลิเคชันของคุณ มันได้รับการแนะนำในReact v0.13
โปรดอ่านเพื่อรับทราบข้อมูลเพิ่มเติมดังนั้นจึงมีบางสิ่งที่พร้อมกับงานนี้สำหรับคุณ:
<div>{React.cloneElement(this.props.children, {...this.props})}</div>
ดังนั้นให้นำเส้นจากเอกสาร React เพื่อให้คุณเข้าใจว่ามันทำงานอย่างไรและคุณสามารถใช้ประโยชน์ได้อย่างไร:
ใน React v0.13 RC2 เราจะแนะนำ API ใหม่คล้ายกับ React.addons.cloneWithProps ด้วยลายเซ็นนี้:
React.cloneElement(element, props, ...children);
แตกต่างจาก cloneWithProps ฟังก์ชั่นใหม่นี้ไม่มีพฤติกรรมเวทย์มนตร์ในตัวสำหรับการผสานสไตล์และ className ด้วยเหตุผลเดียวกันกับที่เราไม่มีคุณสมบัติดังกล่าวจาก transferPropsTo ไม่มีใครแน่ใจว่ารายชื่อของสิ่งมหัศจรรย์ทั้งหมดคืออะไรซึ่งทำให้มันยากที่จะให้เหตุผลเกี่ยวกับรหัสและยากที่จะนำมาใช้ใหม่เมื่อสไตล์มีลายเซ็นที่แตกต่างกัน (เช่นใน React Native)
React.cloneElement เกือบเทียบเท่ากับ:
<element.type {...element.props} {...props}>{children}</element.type>
อย่างไรก็ตามแตกต่างจาก JSX และ cloneWithProps ก็ยังรักษา refs ซึ่งหมายความว่าหากคุณมีลูกด้วยการอ้างอิงคุณจะไม่ขโมยมันจากบรรพบุรุษของคุณ คุณจะได้รับการอ้างอิงเดียวกันกับองค์ประกอบใหม่ของคุณ
รูปแบบทั่วไปอย่างหนึ่งคือการแมปกับลูก ๆ ของคุณและเพิ่มเสาใหม่ มีปัญหามากมายที่รายงานเกี่ยวกับ cloneWithProps ที่สูญเสียการอ้างอิงทำให้ยากที่จะให้เหตุผลเกี่ยวกับรหัสของคุณ ตอนนี้ตามรูปแบบเดียวกันกับ cloneElement จะทำงานตามที่คาดไว้ ตัวอย่างเช่น:
var newChildren = React.Children.map(this.props.children, function(child) {
return React.cloneElement(child, { foo: true })
});
หมายเหตุ: React.cloneElement (child, {ref: 'newRef'}) จะแทนที่การอ้างอิงดังนั้นจึงเป็นไปไม่ได้ที่ผู้ปกครองสองคนจะมีการอ้างอิงถึงเด็กคนเดียวกันยกเว้นว่าคุณใช้ call-refs
นี่เป็นคุณสมบัติที่สำคัญในการเข้าทำปฏิกิริยา 0.13 เนื่องจากอุปกรณ์ประกอบฉากไม่เปลี่ยนรูป เส้นทางการอัพเกรดมักจะโคลนองค์ประกอบ แต่โดยการทำเช่นนั้นคุณอาจสูญเสียการอ้างอิง ดังนั้นเราต้องการเส้นทางการอัพเกรดที่ดีกว่าที่นี่ เมื่อเราอัพเกรดเว็บไซต์ที่ Facebook เรารู้ว่าเราต้องการวิธีนี้ เราได้รับการตอบรับที่เหมือนกันจากชุมชน ดังนั้นเราจึงตัดสินใจสร้าง RC อีกครั้งก่อนการเปิดตัวขั้นสุดท้ายเพื่อให้แน่ใจว่าเราได้รับสิ่งนี้
เราวางแผนที่จะคัดค้าน React.addons.cloneWithProps ในที่สุด เรายังไม่ได้ทำ แต่นี่เป็นโอกาสที่ดีในการเริ่มคิดเกี่ยวกับการใช้ของคุณเองและลองใช้ React.cloneElement แทน เราจะแน่ใจว่าได้จัดส่งการแจ้งเตือนด้วยการคัดค้านก่อนที่เราจะลบออกจริง ๆ ดังนั้นจึงไม่จำเป็นต้องดำเนินการ
เพิ่มเติมที่นี่ ...