ชื่อเรื่องบอกทุกอย่าง ฉันเข้าใจว่าเหตุใดจึงcomponentDidMount
เหมาะสมสำหรับทุกสิ่งที่ต้องการการเข้าถึง DOM แต่คำขอ AJAX ไม่จำเป็นหรือมักจะต้องการสิ่งนี้
สิ่งที่ช่วยให้?
ชื่อเรื่องบอกทุกอย่าง ฉันเข้าใจว่าเหตุใดจึงcomponentDidMount
เหมาะสมสำหรับทุกสิ่งที่ต้องการการเข้าถึง DOM แต่คำขอ AJAX ไม่จำเป็นหรือมักจะต้องการสิ่งนี้
สิ่งที่ช่วยให้?
คำตอบ:
componentDidMount
มีไว้สำหรับผลข้างเคียง การเพิ่มผู้ฟังเหตุการณ์ AJAX การกลายพันธุ์ DOM ฯลฯ
componentWillMount
ไม่ค่อยมีประโยชน์ โดยเฉพาะอย่างยิ่งหากคุณสนใจเกี่ยวกับการแสดงผลฝั่งเซิร์ฟเวอร์ (การเพิ่มตัวฟังเหตุการณ์ทำให้เกิดข้อผิดพลาดและการรั่วไหลและสิ่งอื่น ๆ อีกมากมายที่อาจผิดพลาดได้)
มีการพูดคุยเกี่ยวกับการลบออกcomponentWillMount
จากส่วนประกอบของคลาสเนื่องจากมีจุดประสงค์เดียวกับตัวสร้าง มันจะยังคงอยู่บนcreateClass
ส่วนประกอบ
componentWillMount
? ฉันไม่เห็นความแตกต่างจริงๆ
componentWillMount
จะถูกดำเนินการบนการแสดงผลบนเซิร์ฟเวอร์ หากคุณกำลังใช้งานcomponentDidMount
นั้นจะถูกดำเนินการบนไคลเอนต์เท่านั้น ด้วยเหตุนี้การใส่สิ่งต่างๆในcomponentWillMount
การโต้ตอบภายนอกหรือเชื่อมโยงกับเหตุการณ์ ฯลฯ จึงไม่ใช่ความคิดที่ดี หากคุณไม่มีแผนที่จะแสดงผลส่วนประกอบของคุณบนเซิร์ฟเวอร์ก็ยังไม่ใช่ความคิดที่ดีสำหรับการพกพาโค้ดเท่านั้น ทั้งหมดนี้อยู่นอกเหตุผลหลักที่มันไม่ดีซึ่งอธิบายไว้ในคำตอบของ @daniula
ฉันมีปัญหาเดียวกันในตอนแรกด้วย ฉันตัดสินใจที่จะลองทำตามคำขอcomponentWillMount
แต่สุดท้ายเกิดปัญหาเล็ก ๆ น้อย ๆ
ฉันทริกเกอร์การเรนเดอร์เมื่อการโทรของ ajax เสร็จสิ้นด้วยข้อมูลใหม่ ในบางจุดการเรนเดอร์คอมโพเนนต์ใช้เวลามากกว่าการตอบสนองจากเซิร์ฟเวอร์และเมื่อถึงจุดนี้การโทรกลับของ ajax จะทำให้เกิดการเรนเดอร์บนคอมโพเนนต์ที่ไม่ได้ต่อเชื่อม นี้เป็นชนิดของกรณีขอบ componentDidMount
แต่อาจมีมากขึ้นดังนั้นจึงปลอดภัยในการติด
componentWillMount
ดังนั้นคุณควรใช้componentDidMount
สำหรับการโทร ajax ของคุณต่อไป
setState
ใช้ตัวสร้างคอมโพเนนต์และคุณไม่มีทางกำหนดได้ว่าการเรียก AJAX จะเสร็จสมบูรณ์เมื่อใด twitter.com/dan_abramov/status/576453138598723585
ตามเอกสารการตั้งค่าสถานะในcomponentWillMount
จะไม่ทำให้เกิดการเรนเดอร์ หากการเรียก AJAX ไม่ได้ปิดกั้นและคุณส่งคืนสถานะPromise
ที่อัปเดตของคอมโพเนนต์สำเร็จมีโอกาสที่การตอบกลับจะมาถึงเมื่อคอมโพเนนต์ถูกแสดงผล เนื่องจากcomponentWillMount
ไม่ได้ทริกเกอร์การเรนเดอร์ซ้ำคุณจะไม่มีพฤติกรรมที่คุณคาดหวังซึ่งเป็นส่วนประกอบที่แสดงผลด้วยข้อมูลที่ร้องขอ
หากคุณใช้ไลบรารีฟลักซ์ใด ๆ และข้อมูลที่ร้องขอลงท้ายด้วยการจัดเก็บส่วนประกอบนั้นเชื่อมต่อ (หรือสืบทอดจากส่วนประกอบที่เชื่อมต่อ) สิ่งนี้จะไม่เป็นปัญหาเนื่องจากการรับข้อมูลนั้นส่วนใหญ่จะเปลี่ยนอุปกรณ์ประกอบฉาก ในที่สุด.
componentWillMount
ไม่ทริกเกอร์การเรนเดอร์ซ้ำเพียงเพราะมีการกำหนดสถานะใหม่ก่อนการเรนเดอร์ครั้งแรก แต่ถ้าsetState
ถูกเรียกในการเรียกกลับแบบ AJAX จะถูกเรียกอย่างแน่นอนที่สุดหลังจากการเรนเดอร์ครั้งแรกและจะทำให้เกิดการเรนเดอร์ใหม่
componentWillMount
นั้นจะล้มเหลวเนื่องจากส่วนประกอบนั้น ...