“ การติดตั้ง” ใน React js คืออะไร?


128

ฉันได้ยินคำว่า "เมานต์" หลายครั้งเกินไปในขณะที่เรียนรู้ ReactJS และดูเหมือนจะมีวิธีการตลอดอายุการใช้งานและข้อผิดพลาดเกี่ยวกับคำนี้ React หมายถึงอะไรโดยการติดตั้ง?

ตัวอย่าง: componentDidMount() and componentWillMount()

คำตอบ:


139

งานหลักของ React คือการหาวิธีแก้ไข DOM ให้ตรงกับส่วนประกอบที่ต้องการแสดงบนหน้าจอ

การตอบสนองทำได้โดยการ "ติดตั้ง" (การเพิ่มโหนดไปยัง DOM) "การยกเลิกการต่อเชื่อม" (การลบออกจาก DOM) และ "การอัปเดต" (การเปลี่ยนแปลงโหนดที่มีอยู่แล้วใน DOM)

วิธีตอบสนองโหนดจะแสดงเป็นโหนด DOM และที่ไหนและเมื่อใดที่ปรากฏในต้นไม้ DOM มีการจัดการโดยระดับบนสุด API เพื่อให้ได้แนวคิดที่ดีขึ้นเกี่ยวกับสิ่งที่เกิดขึ้นให้ดูตัวอย่างง่ายๆที่สุดเท่าที่จะทำได้:

// JSX version: let foo = <FooComponent />;
let foo = React.createElement(FooComponent);

แล้วfooคุณสามารถทำอะไรได้บ้าง? fooในขณะนี้เป็นวัตถุ JavaScript ธรรมดาที่มีลักษณะประมาณนี้ (ตัวย่อ):

{
  type: FooComponent,
  props: {}
}

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

คุณสามารถบอกให้ React "mount" ลงในคอนเทนเนอร์ DOM ได้โดยเรียก:

ReactDOM.render(foo, domContainer);

สิ่งนี้จะบอกว่า React ถึงเวลาแสดงfooบนหน้า React จะสร้างอินสแตนซ์ของFooComponentคลาสและเรียกrenderใช้เมธอด สมมติว่ามันแสดงผล a <div />ในกรณีนั้น React จะสร้างdivโหนด DOM ขึ้นมาและใส่ลงในคอนเทนเนอร์ DOM

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

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


9
ฉันอยากจะชี้ให้เห็นว่าเมื่อคุณโทรหาReact.createElement(FooComponent)คุณไม่ได้สร้างอินสแตนซ์ของFooComponent. fooคือการแสดง DOM เสมือนFooComponentหรือที่เรียกว่าอิลิเมนต์ React แต่อาจจะเป็นสิ่งที่คุณหมายโดยทำปฏิกิริยาชนิดFooComponent ไม่ว่าคุณจะไม่เมานต์ส่วนประกอบใน React คุณเรียกการเรนเดอร์ซึ่งอาจต่อเชื่อมคอมโพเนนต์หากจำเป็นต้องสร้างโหนด DOM จริงเพื่อแสดงส่วนประกอบในทรี DOM การติดตั้งจริงคือเหตุการณ์ที่เกิดขึ้นเป็นครั้งแรก
John Leidegren

5
การติดตั้งหมายถึงการแนบอินสแตนซ์คอมโพเนนต์ React เข้ากับโหนด DOM ซึ่งจำเป็นในการอัปเดตการแสดงผลแบบทรี / การแสดงผลที่เพิ่มขึ้นในการเรียกการแสดงผลในภายหลัง
John Leidegren

3
ฉันใช้เสรีภาพในการแก้ไขคำตอบนี้เพราะได้รับการยอมรับแล้ว แต่มีความเข้าใจผิดอยู่เล็กน้อย (เช่นคุณไม่สามารถเรียกใช้findDOMNodeองค์ประกอบ React ได้)
Dan Abramov

1
การยกเลิกการต่อเชื่อม @Rahamin เกิดขึ้นเมื่อมีการถอด / เปลี่ยนส่วนประกอบหากคุณเลื่อนไปมาระหว่างฉากต่างๆในลักษณะที่ไม่มีการเรนเดอร์คุณจะไม่รับประกันว่าจะมีสัญญาณยกเลิกการต่อเชื่อม componentWillUnmount ไม่เหมือนกับการยกเลิกการโหลดเพจ
John Leidegren

1
@Yossi นี่คือตัวอย่างของการติดตั้งอย่างชัดเจนและยกเลิกการติดตั้งส่วนประกอบในชุดทดสอบ: stackoverflow.com/a/55359234/6225838
CPHPython

38

ปฏิกิริยาเป็นกรอบไอโซมอร์ฟิก / สากล นั่นหมายความว่ามีการแสดงเสมือนของโครงสร้างองค์ประกอบ UI และแยกจากการแสดงผลจริงที่ส่งออกในเบราว์เซอร์ จากเอกสารประกอบ:

การตอบสนองนั้นรวดเร็วมากเพราะไม่เคยพูดคุยกับ DOM โดยตรง React รักษาการแทนค่า DOM ในหน่วยความจำอย่างรวดเร็ว

อย่างไรก็ตามการแสดงในหน่วยความจำนั้นไม่ได้เชื่อมโยงโดยตรงกับ DOM ในเบราว์เซอร์ (แม้ว่าจะเรียกว่า Virtual DOM ซึ่งเป็นชื่อที่โชคร้ายและสับสนสำหรับเฟรมเวิร์กแอปสากล) และเป็นเพียงข้อมูลที่คล้าย DOM โครงสร้างที่แสดงลำดับชั้นส่วนประกอบ UI ทั้งหมดและข้อมูลเมตาเพิ่มเติม Virtual DOM เป็นเพียงรายละเอียดการใช้งาน

"เราคิดว่ารากฐานที่แท้จริงของ React เป็นเพียงแนวคิดของส่วนประกอบและองค์ประกอบ: ความสามารถในการอธิบายสิ่งที่คุณต้องการแสดงผลในลักษณะที่เปิดเผยได้สิ่งเหล่านี้คือชิ้นส่วนที่ใช้ร่วมกันโดยแพ็กเกจที่แตกต่างกันทั้งหมดนี้ส่วนของ React ที่เฉพาะเจาะจงสำหรับการแสดงผลบางอย่าง โดยปกติเป้าหมายจะไม่ใช่สิ่งที่เราคิดเมื่อเรานึกถึง React " - ตอบสนองบล็อก js

ดังนั้นข้อสรุปก็คือReact คือการแสดงผลแบบไม่เชื่อเรื่องพระเจ้าซึ่งหมายความว่ามันไม่สนใจว่าผลลัพธ์สุดท้ายคืออะไร สามารถเป็น DOM Tree ในเบราว์เซอร์อาจเป็น XML, Native Components หรือ JSON

"เมื่อเราดูแพ็กเกจเช่น react-native, react-art, react-canvas และ react-three เป็นที่ชัดเจนว่าความสวยงามและสาระสำคัญของ React ไม่เกี่ยวข้องกับเบราว์เซอร์หรือ DOM" - ตอบสนองบล็อก js

ตอนนี้คุณรู้แล้วว่า React ทำงานอย่างไรมันก็ง่ายที่จะตอบคำถามของคุณ :)

การติดตั้งเป็นกระบวนการในการส่งออกการแสดงเสมือนของส่วนประกอบในการแสดง UI ขั้นสุดท้าย (เช่น DOM หรือ Native Components)

ในเบราว์เซอร์ที่หมายถึงการส่งออก React Element ไปยังองค์ประกอบ DOM จริง (เช่น HTML divหรือองค์ประกอบli ) ในโครงสร้าง DOM ในแอปพลิเคชันแบบเนทีฟนั่นหมายถึงการส่งออกองค์ประกอบการตอบสนองไปยังองค์ประกอบดั้งเดิม คุณยังสามารถเขียนเรนเดอร์ของคุณเองและเอาท์พุทส่วนประกอบ React เป็น JSON หรือ XML หรือแม้แต่ XAML หากคุณมีความกล้า

ดังนั้นตัวจัดการการติดตั้ง / การยกเลิกการต่อเชื่อมจึงมีความสำคัญต่อแอ็พพลิเคชัน React เนื่องจากคุณสามารถมั่นใจได้ว่าส่วนประกอบจะถูกส่งออก / แสดงผลเมื่อติดตั้งเท่านั้น อย่างไรก็ตามcomponentDidMountตัวจัดการจะถูกเรียกใช้เฉพาะเมื่อแสดงผลไปยังการแสดง UI จริง (DOM หรือส่วนประกอบดั้งเดิม) แต่ไม่ใช่ถ้าคุณกำลังแสดงผลเป็นสตริง HTML บนเซิร์ฟเวอร์โดยใช้renderToStringซึ่งเหมาะสมเนื่องจากส่วนประกอบไม่ได้ถูกต่อเข้าจริงจนกว่าจะถึง เบราว์เซอร์และดำเนินการในนั้น

และใช่การติดตั้งเป็นชื่อที่โชคร้าย / น่าสับสนถ้าคุณถามฉัน IMHO componentDidRenderและcomponentWillRenderน่าจะเป็นชื่อที่ดีกว่ามาก


6
มีคนชี้ให้ฉันดูคำตอบนี้จากฟอรัมอื่น ฉันไม่คิดว่าcomponentDidRenderจะทดแทนได้componentDidMountเพราะส่วนประกอบสามารถแสดงผลได้หลายครั้งเมื่ออุปกรณ์ประกอบฉากเปลี่ยนไปหลังจากติดตั้งครั้งเดียว
Gaurav

@TheMinister มันถูกเรียกว่าไลบรารี "virtual DOM" เพราะมันไม่ได้เริ่มต้นจาก isomorphic แต่จริงๆแล้วเชื่อมโยงกับ DOM ตั้งแต่เริ่มต้น มันเป็นความคิดที่จะทำให้มันเป็นไอโซมอร์ฟิก
Isiah Meadows

ดังนั้นภูเขาคือกันกับการแสดงผล ? ในกรณีนี้เป็นความจริงหรือไม่ที่ส่วนประกอบถูกต่อ / แสดงผลสำหรับแต่ละสมมุติฐานต่อไปนี้: (id === that.id) ? <Component /> : null| /app/items/:id| this.setState(...).
Cody

1
ลิงก์ไปยัง / react-js-the-king-of-universal-apps / เสีย
Michael Freidgeim

ฉันแก้ไขการโพสต์ครั้งที่สองที่จะเอาลิงค์เสีย/react-js-the-king-of-universal-apps/( กับการแก้ไข-ความคิดเห็นอย่างชัดเจนการกล่าวขวัญว่าเป็นลิงค์เสีย ) แต่คนรอบข้างได้ปฏิเสธที่จะแก้ไขทั้งสองครั้ง มีใครช่วยแนะนำฉันได้ไหมว่ามีอะไรผิดพลาดในการแก้ไขคำตอบและลบลิงก์ที่เสีย
Aaditya Sharma

12

การติดตั้งหมายถึงส่วนประกอบใน React (โหนด DOM ที่สร้างขึ้น) ที่แนบกับบางส่วนของเอกสาร แค่นั้นแหละ!

การละเว้น React คุณสามารถคิดว่าฟังก์ชันเนทีฟทั้งสองนี้เป็นการติดตั้ง:

replaceChild

appendChild

ซึ่งน่าจะเป็นฟังก์ชันทั่วไปที่ React ใช้เพื่อติดตั้งภายใน

คิดถึง:

componentWillMount === ก่อนเมาท์

และ:

componentDidMount === หลังจากเมาท์


ถ้าการติดตั้งคล้ายกับappendChildอะไรrender?
Deke

ฉันคิดว่าคุณสามารถพูดได้ว่าrenderเป็นวิธีการจริงที่จะทำการติดตั้งเอง ดังนั้นcomponentWillMount== ก่อนหน้านี้render== ทำการแทรก DOM และcomponentDidMount== หลังจากเมานต์ (หรือrenderเรียกว่า DOM API เพื่อแทรกส่วนประกอบและการดำเนินการแบบอะซิงโครนัสนั้นเสร็จสมบูรณ์แล้ว)
Rob

8

https://facebook.github.io/react/docs/tutorial.html

ที่นี่ componentDidMount เป็นวิธีการที่เรียกโดยอัตโนมัติโดย React เมื่อคอมโพเนนต์ถูกแสดงผล

แนวคิดก็คือคุณกำลังบอก ReactJS ว่า "โปรดใช้สิ่งนี้กล่องแสดงความคิดเห็นนี้หรือรูปภาพที่หมุนหรืออะไรก็ได้ที่ฉันต้องการในหน้าเบราว์เซอร์และนำไปวางบนหน้าเบราว์เซอร์จริงๆเมื่อเสร็จแล้วให้โทร หน้าที่ของฉันที่ฉันผูกพันcomponentDidMountเพื่อที่ฉันจะได้ดำเนินการต่อไป "

componentWillMountตรงกันข้าม มันจะเริ่มทำงานทันทีก่อนที่ส่วนประกอบของคุณจะแสดงผล

ดูเพิ่มเติมที่นี่ https://facebook.github.io/react/docs/component-specs.html

สุดท้ายคำว่า "mount" ดูเหมือนจะไม่ซ้ำกันสำหรับ react.js ฉันไม่คิดว่ามันเป็นแนวคิดทั่วไปของจาวาสคริปต์หรือแม้แต่แนวคิดเบราว์เซอร์ทั่วไป


จึงเรียกได้ว่า "วาง"?
ประตู

ฉันจะบอกว่าใช่
Ross Presser

ฉันจะบอกว่าใบเสนอราคาค่อนข้างทำให้เข้าใจผิดเนื่องจากจะเรียกหลังจากการแสดงผลครั้งแรกเท่านั้นไม่ใช่ในการแสดงผลซ้ำที่เกิดจากการอัปเดต แล้วcomponentDidUpdateจะเรียกแทน.
Hannes Johansson

+1 สำหรับfacebook.github.io/react/docs/…คำอธิบายนี้ยืนยันว่าวางไว้;)
ประตู

5

การติดตั้งหมายถึงการโหลดเพจเริ่มต้นเมื่อคอมโพเนนต์ React ของคุณแสดงผลครั้งแรก จากเอกสาร React สำหรับ Mounting: componentDidMount:

Invoked once, only on the client (not on the server), immediately after the initial rendering occurs. At this point in the lifecycle, the component has a DOM representation which you can access via React.findDOMNode(this).

คุณสามารถตัดกันสิ่งนี้กับฟังก์ชัน componentDidUpdate ซึ่งเรียกว่าทุกครั้งที่ React แสดงผล (ยกเว้นการเมาท์เริ่มต้น)


3

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

เพื่อให้ง่ายขึ้นการติดตั้งหมายความว่าคอมโพเนนต์ถูกโหลดไปยัง DOM และไม่ได้ต่อเชื่อมหมายความว่าส่วนประกอบถูกลบออกจาก DOM

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