0Pricing
React Academy · บทเรียน

Selector และการป้องกันการเรนเดอร์ซ้ำโดยไม่จำเป็น

ดึงส่วนย่อยของสถานะที่ต้องการผ่าน selector เพื่อให้คอมโพเนนต์เรนเดอร์ซ้ำเฉพาะเมื่อจำเป็น

Selector และการป้องกันการเรนเดอร์ซ้ำโดยไม่จำเป็น เป็นบทเรียน React Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน React Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส React Academy มีบทเรียนทั้งหมด 4 บทเรียน

ยินดีต้อนรับ

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

ปัญหาของตัวเลือกเริ่มต้น

การเรียกฮุกของสโตร์โดยไม่ใช้ตัวเลือกจะส่งคืนอ็อบเจ็กต์สโตร์ทั้งหมด คอมโพเนนต์จะเรนเดอร์ใหม่เมื่อสโตร์มีการเปลี่ยนแปลง EVERY ครั้ง แม้การเปลี่ยนแปลงนั้นจะเกิดกับสถานะที่ไม่เกี่ยวข้องกันก็ตาม
// Bad: re-renders on every store change
const store = useAppStore();
return <p>{store.user.name}</p>;

การใช้ตัวเลือก

ส่งฟังก์ชันตัวเลือกให้ฮุกของสโตร์ คอมโพเนนต์จะเรนเดอร์ใหม่เฉพาะเมื่อค่าที่ฟังก์ชันตัวเลือกส่งคืนเปลี่ยนแปลง
// Good: re-renders only when user.name changes
const name = useAppStore(s => s.user.name);
return <p>{name}</p>;

การตรวจสอบความเท่ากันของการอ้างอิง

Zustand ใช้ความเท่ากันแบบเข้มงวด (===) โดยค่าเริ่มต้น หากตัวเลือกของคุณส่งคืนอ็อบเจ็กต์หรืออาร์เรย์ใหม่ทุกครั้ง คอมโพเนนต์จะเรนเดอร์ใหม่แม้เนื้อหาจะเหมือนเดิม
// Creates a new object every time — always re-renders!
const info = useStore(s => ({ id: s.id, name: s.name }));

การแก้ไขด้วยความเท่ากันแบบตื้น

นำเข้า `shallow` จาก zustand แล้วส่งเป็นฟังก์ชันตรวจสอบความเท่ากัน เพื่อหลีกเลี่ยงการเรนเดอร์ใหม่เมื่อเนื้อหาของอ็อบเจ็กต์เหมือนเดิม
import { shallow } from 'zustand/shallow';

const info = useAppStore(
  s => ({ id: s.id, name: s.name }),
  shallow // compare by content, not reference
);

การเลือกค่าหลายค่า

ใช้รูปแบบการเปรียบเทียบแบบตื้นเพื่อเลือกค่าหลายค่าพร้อมกัน โดยไม่ทำให้เกิดการเรนเดอร์ใหม่ที่ไม่จำเป็น
const { items, loading } = useCartStore(
  s => ({ items: s.items, loading: s.loading }),
  shallow
);

การอ้างอิงแอ็กชันที่คงที่

แอ็กชัน (ฟังก์ชัน) ใน Zustand มีการอ้างอิงที่คงที่ จึงไม่เปลี่ยนแปลงเมื่อสถานะอัปเดต คุณสามารถเลือกแอ็กชันเหล่านี้ได้โดยไม่ใช้ shallow และแอ็กชันจะไม่ทำให้เกิดการเรนเดอร์ใหม่
// Actions are always stable — no shallow needed
const addToCart = useCartStore(s => s.addToCart);

ตัวช่วย useShallow (Zustand v5+)

Zustand v5 มีเครื่องมือ useShallow ที่ครอบตัวเลือกด้วยความเท่ากันแบบตื้นโดยอัตโนมัติ ทำให้โค้ดสะอาดขึ้น
import { useShallow } from 'zustand/react/shallow';

const { items, loading } = useCartStore(
  useShallow(s => ({ items: s.items, loading: s.loading }))
);

การรวมตัวเลือก

คำนวณค่าที่ได้จากสถานะภายในตัวเลือก เพื่อหลีกเลี่ยงการเก็บสถานะที่คำนวณแล้วไว้ในสโตร์ ให้คำนวณผลรวม รายการที่กรองแล้ว หรือสตริงที่จัดรูปแบบแล้วภายในตัวเลือก
const totalPrice = useCartStore(
  s => s.items.reduce((sum, item) => sum + item.price, 0)
);

การวิเคราะห์การเรนเดอร์ใหม่ของ Zustand

ใช้ตัวสร้างโปรไฟล์ของ React DevTools เพื่อตรวจสอบว่าตัวเลือกทำงานถูกต้อง หลังจากเพิ่มรายการที่ไม่เกี่ยวข้องลงในสโตร์ ให้ตรวจสอบว่าคอมโพเนนต์ที่ใช้เฉพาะตัวเลือกชื่อไม่ปรากฏในกราฟเปลวไฟของการคอมมิต

ตรวจสอบความเข้าใจ

เหตุใดจึงต้องใช้ความเท่ากันแบบตื้นเมื่อตัวเลือกของ Zustand ส่งคืนอ็อบเจ็กต์

สรุปทบทวน

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

บทเรียนถัดไป

บทเรียนถัดไป: **การคงสถานะด้วยมิดเดิลแวร์ Persist** — คุณจะซิงค์สถานะของ Zustand ไปยัง localStorage ด้วยมิดเดิลแวร์ persist

คำถามที่พบบ่อย

บทเรียน “Selector และการป้องกันการเรนเดอร์ซ้ำโดยไม่จำเป็น” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “Selector และการป้องกันการเรนเดอร์ซ้ำโดยไม่จำเป็น” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส React Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส React Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “Selector และการป้องกันการเรนเดอร์ซ้ำโดยไม่จำเป็น”

ดึงส่วนย่อยของสถานะที่ต้องการผ่าน selector เพื่อให้คอมโพเนนต์เรนเดอร์ซ้ำเฉพาะเมื่อจำเป็น คุณปฏิบัติ React Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน React Academy หรือไม่

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

บทเรียน “Selector และการป้องกันการเรนเดอร์ซ้ำโดยไม่จำเป็น” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน React Academy นี้ได้ไหม

ได้ บทเรียน React Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. การสร้าง Zustand Store แรกของคุณ
  2. Selector และการป้องกันการเรนเดอร์ซ้ำโดยไม่จำเป็น
  3. การคงสถานะด้วยมิดเดิลแวร์ Persist
  4. Zustand DevTools และการทดสอบ Store
← กลับไปที่ React Academy