React.Component vs React.PureComponent


224

เอกสารตอบโต้อย่างเป็นทางการระบุว่า " React.PureComponentเป็นshouldComponentUpdate()เพียงการเปรียบเทียบวัตถุที่ตื้นเท่านั้น" และให้คำแนะนำในกรณีนี้หากรัฐ "ลึก"

ป.ร. ให้ไว้ ณ นี้มีเหตุผลใดทำไมหนึ่งควรจะชอบReact.PureComponentเมื่อสร้างส่วนประกอบ React?

คำถาม :

  • มีผลกระทบต่อประสิทธิภาพการใช้งานReact.Componentที่เราอาจพิจารณาใช้React.PureComponentหรือไม่?
  • ฉันเดา shouldComponentUpdate()ว่าจะPureComponentทำการเปรียบเทียบที่ตื้นเท่านั้น หากเป็นกรณีนี้จะไม่สามารถใช้วิธีการดังกล่าวเพื่อการเปรียบเทียบที่ลึกกว่านี้ได้?
  • "นอกจากนี้React.PureComponent's shouldComponentUpdate()ข้ามประคับประคองการปรับปรุงสำหรับทรีย่อยองค์ประกอบทั้ง" - นี้ไม่ได้หมายความว่าการเปลี่ยนแปลง prop จะถูกละเลย?

คำถามเกิดขึ้นจากการอ่านในบล็อกขนาดกลางนี้ถ้ามันช่วยได้


5
ฉันรู้ว่าสองสามเดือนแล้วตั้งแต่คุณโพสต์บทความนี้ แต่ฉันคิดว่าบทความนี้อาจช่วยได้: 60devs.com/pure-component-in-react.html
MrOBrian

คำตอบ:


283

ความแตกต่างที่สำคัญระหว่างReact.PureComponentและReact.ComponentคือPureComponentการเปรียบเทียบตื้น ๆเกี่ยวกับการเปลี่ยนแปลงสถานะ หมายความว่าเมื่อเปรียบเทียบค่าสเกลาร์จะเปรียบเทียบค่าของพวกมัน แต่เมื่อเปรียบเทียบวัตถุ ช่วยปรับปรุงประสิทธิภาพของแอพ

คุณควรไปReact.PureComponentเมื่อคุณสามารถตอบสนองเงื่อนไขใด ๆ ด้านล่าง

  • รัฐ / อุปกรณ์ประกอบฉากควรเป็นวัตถุที่ไม่เปลี่ยนรูป
  • รัฐ / อุปกรณ์ประกอบฉากไม่ควรมีลำดับชั้น
  • คุณควรโทรforceUpdateเมื่อมีการเปลี่ยนแปลงข้อมูล

หากคุณกำลังใช้งานReact.PureComponentคุณควรตรวจสอบให้แน่ใจว่าองค์ประกอบย่อยทั้งหมดนั้นบริสุทธิ์เช่นกัน

มีผลกระทบต่อประสิทธิภาพในการใช้งาน React.com โดยที่เราอาจพิจารณาเลือกใช้ React.PureComponent หรือไม่

ใช่มันจะเพิ่มประสิทธิภาพแอปของคุณ (เนื่องจากการเปรียบเทียบแบบตื้น)

ฉันคาดเดาว่าควรจะ CompompentUpdate () ของ Purecomponent ทำการเปรียบเทียบแบบตื้นเท่านั้น หากเป็นกรณีนี้จะไม่สามารถใช้วิธีการดังกล่าวสำหรับการเปรียบเทียบลึก

คุณเดาได้ถูกต้อง คุณสามารถใช้มันได้หากคุณปฏิบัติตามเงื่อนไขใด ๆ ที่ฉันได้กล่าวไว้ข้างต้น

"นอกจากนี้ React.PureComponent's shouldComponentUpdate () จะข้ามการอัปเดต prop สำหรับทรีย่อยของส่วนประกอบทั้งหมด" - นี่หมายความว่าการเปลี่ยนแปลง prop ถูกเพิกเฉยหรือไม่?

ใช่การเปลี่ยนแปลง prop จะถูกเพิกเฉยหากไม่พบความแตกต่างในการเปรียบเทียบแบบตื้น


1
สวัสดี @VimalrajSankar ขอบคุณสำหรับความช่วยเหลือที่นี่ คุณสามารถโปรดให้ตัวอย่างของคำสั่งต่อไปนี้: It means that when comparing scalar values it compares their values, but when comparing objects it compares only references. It helps to improve the performance of the app.? ขอบคุณ
Ishan Patel

1
@ Mr.Script ฉันหวังว่าสิ่งนี้จะช่วยstackoverflow.com/a/957602/2557900
vimal1083

3
State/Props should not have a hierarchyขออภัยคุณช่วยอธิบายหน่อยว่าลำดับชั้นที่นี่หมายถึงอะไร
Sany Liew

1
@SanyLiew หมายถึงสถานะและอุปกรณ์ประกอบฉากควรมีค่าดั้งเดิมเช่นตัวเลขและสตริงเท่านั้น แต่ไม่ใช่วัตถุภายในวัตถุ (ลำดับชั้น)
jedmao

3
ถ้ารัฐ / อุปกรณ์ประกอบฉากเป็นวัตถุที่ไม่เปลี่ยนรูปก็ควรที่จะมีลำดับชั้นและยังคงใช้ PureComponent ตราบใดที่ลำดับชั้นเหล่านั้นรักษาวัตถุที่ไม่เปลี่ยนรูปได้เช่นกันใช่ไหม?
Sany Liew

40

ComponentและPureComponentมีหนึ่งความแตกต่าง

PureComponentเหมือนกับทุกอย่างComponentยกเว้นว่าจะจัดการกับshouldComponentUpdateวิธีการของคุณ

เมื่ออุปกรณ์ประกอบฉากหรือการเปลี่ยนแปลงของรัฐPureComponentจะทำการเปรียบเทียบตื้นกับอุปกรณ์ประกอบฉากและรัฐ Componentในทางกลับกันจะไม่เปรียบเทียบอุปกรณ์ประกอบฉากในปัจจุบันและบอกต่อจากกล่อง ดังนั้นองค์ประกอบจะแสดงอีกครั้งโดยค่าเริ่มต้นเมื่อใดก็ตามที่shouldComponentUpdateมีการเรียก

เปรียบเทียบตื้น

เมื่อเปรียบเทียบอุปกรณ์ประกอบฉากก่อนหน้าและสถานะถัดไปการเปรียบเทียบแบบตื้นจะตรวจสอบว่าแบบดั้งเดิมมีค่าเดียวกัน (เช่น 1 เท่ากับ 1 หรือเป็นจริงเท่ากับจริง) และการอ้างอิงนั้นเหมือนกันระหว่างค่าจาวาสคริปต์ที่ซับซ้อนกว่าเช่นวัตถุและอาร์เรย์

ที่มา: https://codeburst.io/when-to-use-component-or-purecomponent-a60cfad01a81


React.Component => ดังนั้นหากฉันแสดงองค์ประกอบเดียวกันซ้ำอีกครั้งด้วยอุปกรณ์ประกอบฉากเดียวกันหลายครั้ง มันจะทริกเกอร์มันแสดงผลของเด็ก ไม่ว่าจะเปลี่ยนอุปกรณ์ประกอบฉากหรือไม่
ก็ตาม

24

ความแตกต่างที่สำคัญอย่างที่ฉันเห็นก็คืออุปกรณ์จะแสดงผลทุกครั้งที่ผู้ปกครองแสดงผลโดยไม่คำนึงว่าอุปกรณ์ประกอบฉากและสถานะขององค์ประกอบนั้นมีการเปลี่ยนแปลงหรือไม่

ในทางกลับกันส่วนประกอบที่บริสุทธิ์จะไม่แสดงผลอีกครั้งหากผู้เรนเดอร์ตัวนั้นยกเว้นว่าอุปกรณ์ประกอบฉากของแท้ (หรือสถานะ) เปลี่ยนไป

ตัวอย่างเช่นสมมติว่าเรามีโครงสร้างส่วนประกอบที่มีลำดับชั้นสามระดับ ได้แก่ ผู้ปกครองเด็กและลูกหลาน

เมื่ออุปกรณ์ประกอบฉากของผู้ปกครองมีการเปลี่ยนแปลงในลักษณะที่เปลี่ยนอุปกรณ์ประกอบฉากของเด็กเพียงคนเดียวจากนั้น:

  • ถ้าส่วนประกอบทั้งหมดเป็นองค์ประกอบปกติทรีคอมโพเนนต์ทั้งหมดจะแสดงผลซ้ำ
  • หากเด็กและลูกหลานทั้งหมดเป็นองค์ประกอบที่บริสุทธิ์แล้วเด็กเพียงคนเดียวเท่านั้นที่จะแสดงผลและลูกหลานหนึ่งหรือทั้งหมดขึ้นอยู่กับว่าอุปกรณ์ของพวกเขามีการเปลี่ยนแปลง หากมีองค์ประกอบจำนวนมากในแผนผังองค์ประกอบนี้ก็อาจหมายถึงการเพิ่มประสิทธิภาพที่สำคัญ

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

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

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

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