ฉันควรใช้ useEffect อย่างใดอย่างหนึ่งหรือหลายอย่างในส่วนประกอบ?


118

ฉันมีผลข้างเคียงที่จะนำไปใช้และต้องการทราบวิธีจัดระเบียบ:

  • เป็นการใช้งานครั้งเดียว
  • หรือใช้หลายอย่าง

อะไรที่ดีกว่าในแง่ของประสิทธิภาพและสถาปัตยกรรม?

คำตอบ:


179

รูปแบบที่คุณต้องปฏิบัติตามขึ้นอยู่กับ useCase ของคุณ

ขั้นแรกคุณอาจมีสถานการณ์ที่คุณต้องเพิ่มตัวฟังเหตุการณ์ในระหว่างการเมาท์ครั้งแรกและทำความสะอาดที่ unmount และอีกกรณีหนึ่งที่ต้องทำความสะอาดตัวฟังเฉพาะและเพิ่มใหม่ในการเปลี่ยนเสา ในกรณีเช่นนี้การใช้ useEffect ที่แตกต่างกันสองแบบจะดีกว่าเพื่อให้ตรรกะที่เกี่ยวข้องเข้าด้วยกันและมีประโยชน์ด้านประสิทธิภาพ

useEffect(() => {
   // adding event listeners on mount here
   return () => {
       // cleaning up the listeners here
   }
}, []);

useEffect(() => {
   // adding listeners everytime props.x changes
   return () => {
       // removing the listener when props.x changes
   }
}, [props.x])

ประการที่สอง:อาจมีบางกรณีที่คุณต้องทริกเกอร์การเรียก API หรือผลข้างเคียงอื่น ๆ เมื่อสถานะหรืออุปกรณ์ประกอบฉากใด ๆ เปลี่ยนไประหว่างชุด ในกรณีเช่นนี้ค่าเดียวที่useEffectมีค่าที่เกี่ยวข้องในการตรวจสอบควรเป็นความคิดที่ดี

useEffect(() => {
    // side effect here on change of any of props.x or stateY
}, [props.x, stateY])

ประการที่สาม:กรณีที่สามเมื่อคุณจำเป็นต้องดำเนินการต่างๆในการเปลี่ยนแปลงค่าต่างๆ ในกรณีนี้ให้แยกการเปรียบเทียบที่เกี่ยวข้องออกเป็นข้อ ๆuseEffects

useEffect(() => {
   // some side-effect on change of props.x
}, [props.x])

useEffect(() => {
   // another side-effect on change of stateX or stateY 
}, [stateX, stateY])

1
สิ่งที่เกี่ยวกับพื้นกลางระหว่างตัวอย่างที่สองและสามด้านบน: คุณมีตรรกะที่ทำงานเมื่อส่วนย่อยของสถานะ / อุปกรณ์ประกอบฉากเปลี่ยนไป แต่แต่ละส่วนมีตรรกะแยกต่างหากที่ต้องทำงานนอกเหนือจากโค้ดทั่วไปที่ต้องรัน? คุณจะไม่ใช้[](เนื่องจากยังคงเป็นเพียงส่วนหนึ่งของสถานะ / อุปกรณ์ประกอบฉากที่คุณกำลังรอการเปลี่ยนแปลง) แต่คุณต้องการใช้โค้ดซ้ำด้วย คุณใช้useEffectsรหัสที่ใช้ร่วมกันแยกกันและใส่ในฟังก์ชันที่แต่ละคนเรียกแยกกันหรือไม่?
ecoe

3
ตามคำตอบด้านล่างแนะนำทีม React ขอแนะนำให้แยกตะขอตามข้อกังวลดังนั้นคุณจะแบ่งมันออกเป็นหลายuseEffectสาย
hakazvaka

35
ฉันชอบวิธีที่คุณเขียน useCase
VerticalGrain

พวกเขาถูกกระตุ้นตามลำดับของคำจำกัดความเสมอหรือไม่? เช่น effect1 ถูกเรียกก่อนเสมอจากนั้น effect2?
computrius

1
@computrius ใช่ ,React will apply every effect used by the component, in the order they were specified.
สิงหาคม Janse

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