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

React Context สำหรับสถานะธีม

สร้าง ThemeProvider ที่เปิดเผยธีมปัจจุบันและฟังก์ชันสลับธีมให้กับทรีคอมโพเนนต์ทั้งหมด

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

การสร้าง ThemeContext

เริ่มด้วยการเรียก createContext() โดยส่งค่าเริ่มต้นที่มีโครงสร้างตรงกับบริบทของคุณ: const ThemeContext = createContext({ theme: 'light', toggleTheme: () => {} }) ระบบจะใช้ค่าเริ่มต้นนี้เฉพาะเมื่อคอมโพเนนต์อ่านบริบทโดยไม่มีผู้ให้บริการหลักครอบอยู่ ซึ่งช่วยให้ทดสอบคอมโพเนนต์แยกอิสระได้

คอมโพเนนต์ ThemeProvider

คอมโพเนนต์ ThemeProvider เป็นตัวครอบที่เก็บตรรกะทั้งหมดเกี่ยวกับธีม โดยจะอ่านค่ากำหนดของระบบเมื่อเมานต์ จัดการสถานะ theme จัดเตรียมฟังก์ชัน toggleTheme และครอบคอมโพเนนต์ลูกด้วย ThemeContext.Provider value={{ theme, toggleTheme }} ควรวางคอมโพเนนต์นี้ไว้ใกล้ระดับบนสุดของลำดับชั้นคอมโพเนนต์

การใช้บริบทด้วย useContext

คอมโพเนนต์ลูกหลานใด ๆ สามารถเข้าถึงธีมได้ด้วยการเรียก useContext(ThemeContext) ซึ่งจะคืนค่าบริบทปัจจุบันที่มีทั้ง theme และ toggleTheme คอมโพเนนต์จะเรนเดอร์ใหม่โดยอัตโนมัติเมื่อธีมเปลี่ยน จึงซิงค์ข้อมูลให้ตรงกันอยู่เสมอโดยไม่ต้องส่งพร็อปผ่านคอมโพเนนต์หลายชั้น

การซิงค์ data-theme กับ DOM

ตัวแปร CSS ต้องอาศัยแอตทริบิวต์ data-theme บนอิลิเมนต์ราก ใน ThemeProvider ให้เพิ่ม useEffect ที่ทำงานทุกครั้งเมื่อ theme เปลี่ยน: document.documentElement.setAttribute('data-theme', theme) วิธีนี้เชื่อมสถานะของ React เข้ากับชั้น CSS ได้อย่างราบรื่น

การเก็บค่าที่ผู้ใช้เลือกเองใน localStorage

หากต้องการเก็บตัวเลือกของผู้ใช้ไว้แม้โหลดหน้าใหม่ ให้เขียนค่าลงใน localStorage ทุกครั้งที่ธีมเปลี่ยน: localStorage.setItem('theme', theme) คุณสามารถห่อหุ้มตรรกะนี้ไว้ในฮุกแบบกำหนดเองชื่อ useLocalStorage ซึ่งคืนค่าคู่ที่มีลักษณะเหมือนสถานะและบันทึกการอัปเดตทุกครั้งโดยอัตโนมัติ

การเริ่มต้นธีมจาก localStorage

เมื่อเริ่มต้นสถานะธีม ให้พยายามอ่านค่าจาก localStorage ก่อน: localStorage.getItem('theme') หากไม่มีค่าที่บันทึกไว้ ให้ใช้ค่าทดแทนจากค่ากำหนดของระบบผ่าน window.matchMedia('(prefers-color-scheme: dark)').matches การเริ่มต้นนี้จะทำงานเพียงครั้งเดียวเมื่อเมานต์

ลำดับความสำคัญของธีม

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

ฮุก useTheme สำหรับเรียกใช้สะดวก

การเรียก useContext(ThemeContext) โดยตรงในทุกคอมโพเนนต์จะเปิดเผยรายละเอียดการทำงานภายใน แทนที่จะทำเช่นนั้น ให้ส่งออกฮุก useTheme: function useTheme() { return useContext(ThemeContext); } จากนั้นคอมโพเนนต์สามารถนำเข้า useTheme และเรียกใช้ได้โดยไม่ต้องทราบเกี่ยวกับบริบทเบื้องหลัง

การจัดเตรียมฟังก์ชันสลับธีม

ฟังก์ชัน toggleTheme จะสลับระหว่าง light และ dark: setTheme(prev => prev === 'light' ? 'dark' : 'light') ให้เปิดเผยฟังก์ชันนี้ผ่านบริบท เพื่อให้ปุ่มใด ๆ ที่อยู่ที่ใดก็ได้ในลำดับชั้นสามารถเรียกใช้ได้ สถานะอยู่ที่เดียว ส่วนตรรกะการสลับใช้ร่วมกันได้ทั่วทั้งแอป

การจดจำค่าบริบทด้วย useMemo

ออบเจ็กต์ค่าบริบทจะถูกสร้างขึ้นใหม่ทุกครั้งที่ ThemeProvider เรนเดอร์ ให้ห่อหุ้มออบเจ็กต์นี้ด้วย useMemo เพื่อป้องกันการเรนเดอร์ใหม่โดยไม่จำเป็นของผู้ใช้บริบททั้งหมด: const value = useMemo(() => ({ theme, toggleTheme }), [theme]) นี่เป็นการปรับปรุงประสิทธิภาพที่ใช้กันทั่วไปสำหรับผู้ให้บริบท

การทดสอบ ThemeProvider

ในการทดสอบ ให้ครอบการเรนเดอร์ด้วยตัวช่วย renderWithTheme ที่กำหนดเอง โดยใช้ ThemeProvider เป็นตัวครอบ นอกจากนี้ยังสามารถสร้างบริบทจำลองแบบเรียบง่ายสำหรับการทดสอบแบบแยกอิสระได้: ThemeContext.Provider value={{ theme: 'dark', toggleTheme: jest.fn() }} วิธีนี้ช่วยให้ทดสอบคอมโพเนนต์ในสถานะธีมที่กำหนดได้

ลำดับความสำคัญของธีม

ลำดับความสำคัญที่ถูกต้องสำหรับการเริ่มต้นธีมของแอปจากสูงไปต่ำคืออะไร

สรุปบทเรียน: React Context สำหรับสถานะธีม

สร้าง ThemeContext และ ThemeProvider ที่จัดการสถานะธีม ซิงค์กับ localStorage และกำหนด data-theme ให้กับเอกสาร ใช้ฮุก useTheme สำหรับเรียกใช้บริบทอย่างเป็นระเบียบ ลำดับความสำคัญคือ ค่ากำหนดที่บันทึกไว้ จากนั้นคือค่ากำหนดของระบบ และสุดท้ายคือค่าเริ่มต้น

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

บทเรียน “React Context สำหรับสถานะธีม” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “React Context สำหรับสถานะธีม”

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

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

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

บทเรียน “React Context สำหรับสถานะธีม” ใช้เวลานานแค่ไหน

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

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

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

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

  1. การตรวจจับชุดสีของระบบ
  2. ตัวแปร CSS สำหรับสลับธีม
  3. React Context สำหรับสถานะธีม
  4. การคงธีมไว้และป้องกันหน้ากระพริบ
← กลับไปที่ React Academy