หมายเหตุฉันให้คำตอบเชิงลึกเพิ่มเติม ที่นี่
เสื้อคลุมรันไทม์:
มันเป็นวิธีที่งี่เง่าที่สุด
const Wrapper = ({children}) => (
<div>
<div>header</div>
<div>{children}</div>
<div>footer</div>
</div>
);
const App = () => <div>Hello</div>;
const WrappedApp = () => (
<Wrapper>
<App/>
</Wrapper>
);
โปรดทราบว่าchildren
เป็น "เสาพิเศษ" ใน React และตัวอย่างข้างต้นคือน้ำตาลประโยคและเทียบเท่า (เกือบ)<Wrapper children={<App/>}/>
wrapper การเริ่มต้น / HOC
คุณสามารถใช้ส่วนประกอบการสั่งซื้อที่สูงขึ้น (HOC) พวกเขาถูกเพิ่มไปยังเอกสารอย่างเป็นทางการเมื่อเร็ว ๆ นี้
// Signature may look fancy but it's just
// a function that takes a component and returns a new component
const wrapHOC = (WrappedComponent) => (props) => (
<div>
<div>header</div>
<div><WrappedComponent {...props}/></div>
<div>footer</div>
</div>
)
const App = () => <div>Hello</div>;
const WrappedApp = wrapHOC(App);
สิ่งนี้สามารถนำไปสู่การแสดงที่ดีขึ้น (เล็กน้อย) เนื่องจากส่วนประกอบของ wrapper สามารถลัดวงจรการเรนเดอร์หนึ่งก้าวไปข้างหน้าด้วย shouldComponentUpdate ในขณะที่ในกรณีของ wrapper รันไทม์เด็ก ๆ prop น่าจะเป็น ReactElement ที่แตกต่างกัน แม้ว่าคอมโพเนนต์ของคุณจะขยาย PureComponent
โปรดสังเกตว่าconnect
Redux เคยเป็น wrapper รันไทม์ แต่ถูกเปลี่ยนเป็น HOC เพราะอนุญาตให้หลีกเลี่ยงการแสดงผลซ้ำที่ไร้ประโยชน์หากคุณใช้pure
ตัวเลือก (ซึ่งเป็นจริงโดยค่าเริ่มต้น)
คุณไม่ควรเรียก HOC ระหว่างขั้นตอนการสร้างภาพเพราะการสร้างองค์ประกอบแบบ React อาจมีราคาแพง คุณควรเรียก wrappers เหล่านี้เมื่อเริ่มต้น
โปรดทราบว่าเมื่อใช้ส่วนประกอบที่ใช้งานได้ด้านบนรุ่น HOC จะไม่มีการปรับให้เหมาะสมที่มีประโยชน์เพราะส่วนประกอบการทำงานที่ไร้สัญชาตินั้นไม่ได้ใช้งาน shouldComponentUpdate
คำอธิบายเพิ่มเติมได้ที่นี่: https://stackoverflow.com/a/31564812/82609
this.props.children
เป็นส่วนหนึ่งของ API ส่วนประกอบและคาดว่าจะใช้วิธีนี้ ตัวอย่างทีมตอบสนองของใช้เทคนิคนี้เช่นในการถ่ายโอนอุปกรณ์ประกอบฉากและเมื่อพูดถึงเด็กคนเดียว