ชื่อเรื่องบอกทุกอย่าง ฉันเข้าใจว่าเหตุใดจึง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นั้นจะล้มเหลวเนื่องจากส่วนประกอบนั้น ...