สามารถใช้ React.render () หลายครั้งใน DOM ได้หรือไม่


107

ฉันต้องการใช้ React เพื่อเพิ่มส่วนประกอบหลาย ๆ ครั้งตลอด DOM ซอนี้แสดงให้เห็นว่าฉันต้องการทำอะไรและมันไม่ได้ทำให้เกิดข้อผิดพลาดใด ๆ นี่คือรหัส:

HTML:

<div id="container">
    <!-- This element's contents will be replaced with the first component. -->
</div>

<div id="second-container">
    <!-- This element's contents will be replaced with the second component. -->
</div>

JS:

var Hello = React.createClass({
    render: function() {
        return <div>Hello {this.props.name}</div>;
    }
});

React.render(<Hello name="World" />, document.getElementById('container'));

React.render(<Hello name="Second World" />, document.getElementById('second-container'));

ฉันเคยเห็นคำถามนี้แล้วและฉันกลัวว่าการทำตามข้างต้นจะเสี่ยงต่อการที่ส่วนประกอบของปฏิกิริยารบกวนซึ่งกันและกัน คำตอบสำหรับคำถามนั้นแนะนำให้ใช้การแสดงผลฝั่งเซิร์ฟเวอร์ซึ่งไม่ใช่ตัวเลือกสำหรับฉันเนื่องจากฉันใช้ Django ฝั่งเซิร์ฟเวอร์

ในทางกลับกันบางทีสิ่งที่ฉันทำก็โอเคเพราะฉันติดตั้งไลบรารี React เพียงอินสแตนซ์เดียว (ตรงข้ามกับคอมโพเนนต์หลายตัวที่เรียกอินสแตนซ์ของ React ของตัวเอง)?

วิธีการใช้อินสแตนซ์ DOM หลายรายการเป็นวิธีที่ใช้ได้ในการใช้ React หรือไม่

คำตอบ:


120

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


9
ยอดเยี่ยม - นอกจากนี้ยังมีประโยชน์อย่างมากในการ "อัดมากเกินไป" ในแอป Django ที่มีอยู่ ฉันต้องการใช้ Django สำหรับเนื้อหาที่แสดงผลเพื่อรับ SEO และใช้ React สำหรับการโต้ตอบของผู้ใช้กับองค์ประกอบ DOM สิ่งนี้ทำให้ง่ายมากที่จะบรรลุ
YPCrumble

คุณอาจดูที่ shouldComponentUpdate และสามารถบู๊ตประสิทธิภาพได้ในอนาคต (อาจไม่ใช่ในกรณีของคุณ) นี่คือข้อมูลอ้างอิง: facebook.github.io/react/docs/component-specs.html
Jim

@YPCrumble ถ้าคำตอบของถังถูกต้องโปรดทำเครื่องหมาย
Dana Woodman

แล้วกรณีที่มีหลายรายการReactDOM.render()ที่ต้องแทรกส่วนประกอบเหมือนกันdivขึ้นอยู่กับว่าคุณเปิดหน้าใด? โดยเฉพาะอย่างยิ่งคุณมีapp.jsเนื้อหาที่เชื่อมต่อกันที่อัปลักษณ์เพียงรายการเดียวที่มี<script src="app.js">อยู่ในทุกหน้า และที่โหลด libs เช่น jQuery, Bootstrap, React และมีโค้ด JS ที่กำหนดเองและ React Components หากคุณเข้าชมที่คุณมี/foo ReactDOM.render(<Foo />, getElemById('content'))หากคุณ/bar', you have เข้าไปที่ ReactDOM.render (<Bar />, getElemById ('content')) " พวกเขาเข้าไปยุ่ง คุณจัดการเรื่องนี้อย่างไร?
กรีน

3
@ กรีนฉันไม่แน่ใจว่าฉันเข้าใจถ้าส่วนประกอบอยู่ในหน้าแยกกันจะรบกวนได้อย่างไร มิฉะนั้นทำไมไม่เพิ่มองค์ประกอบคอนเทนเนอร์ใหม่สำหรับแต่ละองค์ประกอบเช่นReactDOM.render(<Foo/>, document.getElementById('content').appendChild(document.createElement('div')))
กระโดด

3

วิธีนี้ใช้ได้จากมุมมองด้านประสิทธิภาพการโหลดหน้าเว็บ แต่มีข้อเสียอื่น ๆ และควรหลีกเลี่ยงราก React หลายตัวหากเป็นไปได้

  • React root ที่แตกต่างกันไม่สามารถแชร์บริบทและหากคุณต้องการสื่อสารระหว่าง React root คุณจะต้องใช้ทางเลือกในเหตุการณ์ DOM ส่วนกลาง
  • คุณจะได้รับประโยชน์น้อยลงจากการเพิ่มประสิทธิภาพเช่นการแบ่งเวลา - การแสดงผลแบบไม่ต้องสงสัยและไม่ซิงค์ ไม่สามารถระงับข้ามขอบเขตของ React root ได้

เพิ่มเติมได้ที่ - https://github.com/facebook/react/issues/12700

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