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

การคงสถานะด้วยมิดเดิลแวร์ Persist

ซิงค์สถานะ Zustand ไปยัง localStorage หรือ sessionStorage ด้วยมิดเดิลแวร์ persist

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

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

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

เหตุใดจึงต้องคงสถานะ

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

มิดเดิลแวร์ persist

ครอบการเรียก create() ด้วย persist() และกำหนดคีย์พื้นที่จัดเก็บที่ไม่ซ้ำกัน Zustand จะอ่านข้อมูลจาก localStorage โดยอัตโนมัติเมื่อเริ่มทำงาน และเขียนข้อมูลทุกครั้งที่สถานะเปลี่ยนแปลง
import { create } from 'zustand';
import { persist } from 'zustand/middleware';

const useCartStore = create(
  persist(
    (set) => ({
      items: [],
      addItem: (item) => set(s => ({ items: [...s.items, item] })),
    }),
    { name: 'cart-storage' } // localStorage key
  )
);

การคงสถานะบางส่วนด้วย partialize

ใช้ `partialize` เพื่อคงไว้เฉพาะส่วนย่อยของสโตร์ที่ระบุ วิธีนี้จะไม่นำข้อมูลชั่วคราว เช่น ตัวบ่งชี้การโหลด ไปเก็บใน localStorage
persist(
  (set) => ({ user: null, token: null, loading: false, fetch: () => {} }),
  {
    name: 'auth-storage',
    partialize: (state) => ({ user: state.user, token: state.token }),
    // loading and fetch are NOT persisted
  }
)

การใช้ sessionStorage

หากต้องการคงข้อมูลไว้เฉพาะในเซสชันของเบราว์เซอร์ (ล้างข้อมูลเมื่อปิดแท็บ) ให้ส่ง `createJSONStorage(() => sessionStorage)` เป็นตัวเลือกพื้นที่จัดเก็บ
import { createJSONStorage } from 'zustand/middleware';

persist(storeCreator, {
  name: 'session-data',
  storage: createJSONStorage(() => sessionStorage),
})

การกำหนดเวอร์ชันและการย้ายข้อมูล

เมื่อโครงสร้างสโตร์เปลี่ยนแปลง (มีฟิลด์ใหม่หรือเปลี่ยนชื่อคีย์) ให้กำหนดหมายเลข `version` และระบุฟังก์ชัน `migrate` เพื่ออัปเกรดข้อมูลเก่าที่คงไว้
persist(storeCreator, {
  name: 'my-store',
  version: 2,
  migrate: (persistedState, version) => {
    if (version === 1) {
      return { ...persistedState, newField: 'default' };
    }
    return persistedState;
  },
})

ไฮเดรชันและ SSR

บนเซิร์ฟเวอร์ (Next.js) จะไม่มี localStorage มิดเดิลแวร์ persist ของ Zustand จัดการกรณีนี้อย่างเหมาะสม โดยข้ามไฮเดรชันบนเซิร์ฟเวอร์ และทำไฮเดรชันใหม่บนไคลเอนต์หลังเริ่มทำงาน

การเรียกกลับ onRehydrateStorage

ใช้ `onRehydrateStorage` เพื่อเรียกใช้โค้ดเมื่อสโตร์ถูกกู้คืนจากพื้นที่จัดเก็บ ซึ่งมีประโยชน์สำหรับเรียก API หลังจากกู้คืนโทเค็นแล้ว
persist(storeCreator, {
  name: 'auth',
  onRehydrateStorage: () => (state) => {
    if (state?.token) state.fetchUser();
  },
})

การล้างสถานะที่คงไว้

เรียก `useMyStore.persist.clearStorage()` เพื่อลบข้อมูลที่คงไว้จาก localStorage ซึ่งมีประโยชน์สำหรับขั้นตอนการออกจากระบบ
const handleLogout = () => {
  useAuthStore.persist.clearStorage();
  useAuthStore.setState({ user: null, token: null });
};

ขีดจำกัดขนาดพื้นที่จัดเก็บ

localStorage มีขีดจำกัด 5–10 MB ต่อต้นทาง หลีกเลี่ยงการคงชุดข้อมูลขนาดใหญ่ เช่น แค็ตตาล็อกสินค้าทั้งหมด ให้คงไว้เฉพาะตัวระบุหรืออ็อบเจ็กต์การกำหนดค่าขนาดเล็ก

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

ตัวเลือกใดในมิดเดิลแวร์ persist ที่ช่วยยกเว้นฟิลด์สถานะบางรายการไม่ให้บันทึกลงใน localStorage

สรุปทบทวน

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

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

บทเรียนถัดไป: **DevTools ของ Zustand และการทดสอบสโตร์** — คุณจะเชื่อมต่อกับ Redux DevTools และเขียนการทดสอบหน่วยสำหรับแอ็กชันของ Zustand

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

บทเรียน “การคงสถานะด้วยมิดเดิลแวร์ Persist” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “การคงสถานะด้วยมิดเดิลแวร์ Persist”

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

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

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

บทเรียน “การคงสถานะด้วยมิดเดิลแวร์ Persist” ใช้เวลานานแค่ไหน

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

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

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

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

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