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

การจดจำค่า Context ด้วย useMemo

ห่อออบเจ็กต์ค่าของ Context ด้วย useMemo เพื่อไม่ให้คอมโพเนนต์ที่ใช้งานต้องเรนเดอร์ซ้ำโดยไม่จำเป็น

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

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

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

ปัญหาการอ้างอิงออบเจ็กต์

ทุกครั้งที่คอมโพเนนต์ Provider เรนเดอร์ใหม่ ระบบจะสร้างออบเจ็กต์ลิเทอรัล `{ ... }` ใหม่เป็นค่าบริบท แม้เนื้อหาจะเหมือนเดิมก็ตาม คอมโพเนนต์ผู้ใช้ทั้งหมดจะเรนเดอร์ใหม่เพราะการอ้างอิงเปลี่ยนแปลง
// Every render creates a new object!
<UserCtx.Provider value={{ user, logout }}>
  {children}
</UserCtx.Provider>

การแก้ไขด้วย useMemo

ห่อค่าบริบทด้วย useMemo เพื่อให้ส่งคืนการอ้างอิงออบเจ็กต์เดิมระหว่างการเรนเดอร์ เมื่อไม่มีค่าใดในอาร์เรย์ deps เปลี่ยนแปลง
const value = useMemo(
  () => ({ user, logout }),
  [user, logout]
);

<UserCtx.Provider value={value}>
  {children}
</UserCtx.Provider>

การเลือกรายการการพึ่งพาอย่างรอบคอบ

ใส่ทุกค่าที่ใช้ภายใน useMemo ลงในอาร์เรย์ deps การขาดรายการการพึ่งพาจะทำให้ค่าเก่าไม่อัปเดต ให้ใส่พร็อพส์ชนิดพื้นฐาน เช่น สตริงและตัวเลข รวมถึงการอ้างอิงที่คงที่ เช่น ฟังก์ชันที่ห่อด้วย useCallback

ฟังก์ชันคงที่ด้วย useCallback

ค่าฟังก์ชันจะเปลี่ยนการอ้างอิงในทุกการเรนเดอร์ ให้ห่อฟังก์ชันด้วย useCallback ก่อนใส่ลงในค่าบริบทของ useMemo เพื่อป้องกันการเรนเดอร์ใหม่ที่ไม่จำเป็น
const logout = useCallback(() => {
  clearSession();
  setUser(null);
}, []);

const value = useMemo(() => ({ user, logout }), [user, logout]);

เมื่อไม่จำเป็นต้องจดจำค่า

หากคอมโพเนนต์ Provider ไม่เคยเรนเดอร์ใหม่ เช่น อยู่บนสุดของลำดับชั้นและคอมโพเนนต์แม่ไม่เคยเปลี่ยนแปลง การใช้ useMemo จะเพิ่มภาระโดยไม่ให้ประโยชน์ใด ๆ ให้จดจำค่าเฉพาะเมื่อคอมโพเนนต์ Provider เองเรนเดอร์ใหม่

ค่าพื้นฐานคงที่อยู่แล้ว

หากค่าบริบทเป็นค่าพื้นฐาน เช่น สตริง ตัวเลข หรือบูลีน คุณไม่จำเป็นต้องใช้ useMemo — ค่าพื้นฐานจะถูกเปรียบเทียบด้วยค่า ไม่ใช่การอ้างอิง `value={isDark}` จึงไม่ทำให้เกิดการเรนเดอร์ใหม่เพิ่มเติม
// No useMemo needed for primitives
<ThemeCtx.Provider value={isDark ? 'dark' : 'light'}>
  {children}
</ThemeCtx.Provider>

การวิเคราะห์ผลของการจดจำค่า

ใช้เครื่องมือวิเคราะห์ประสิทธิภาพของ React DevTools เพื่อตรวจสอบว่าการห่อค่าบริบทด้วย useMemo ช่วยลดการเรนเดอร์ใหม่ได้จริง บันทึกเซสชันทั้งก่อนและหลังใช้ เพื่อดูความแตกต่างของจำนวนการคอมมิต

บริบทที่จดจำค่าแบบซ้อนกัน

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

รูปแบบคอมโพเนนต์ Provider

รวมบริบท สถานะ และการจดจำค่าไว้ภายในคอมโพเนนต์ Provider เฉพาะทาง ส่งออกฮุกแบบกำหนดเองสำหรับใช้บริบท นี่คือรูปแบบมาตรฐานสำหรับบริบทที่นำกลับมาใช้ใหม่ได้
export function UserProvider({ children }) {
  const [user, setUser] = useState(null);
  const logout = useCallback(() => setUser(null), []);
  const value = useMemo(() => ({ user, logout }), [user, logout]);
  return <UserCtx.Provider value={value}>{children}</UserCtx.Provider>;
}

export const useUser = () => useContext(UserCtx);

ตรวจสอบอย่างรวดเร็ว

เหตุผลหลักของการห่อออบเจ็กต์ค่าบริบทด้วย useMemo คืออะไร

สรุปทบทวน

ห่อออบเจ็กต์ค่าบริบทด้วย useMemo พร้อม deps ที่ถูกต้อง ทำให้ค่าฟังก์ชันคงที่ด้วย useCallback ค่าพื้นฐานไม่จำเป็นต้องจดจำค่า รวมการตั้งค่าบริบทไว้ในคอมโพเนนต์ Provider พร้อมฮุกแบบกำหนดเอง

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

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

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

บทเรียน “การจดจำค่า Context ด้วย useMemo” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “การจดจำค่า Context ด้วย useMemo”

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

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

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

บทเรียน “การจดจำค่า Context ด้วย useMemo” ใช้เวลานานแค่ไหน

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

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

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

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

  1. การแยก Context เพื่อลดการเรนเดอร์ซ้ำ
  2. การจดจำค่า Context ด้วย useMemo
  3. รูปแบบ Context Selector
  4. กรณีที่ไม่ควรใช้ Context
← กลับไปที่ React Academy