ข้ามไปยังเนื้อหา

State Management & Stores

$state แบบ local ในคอมโพเนนต์ก็พอแล้ว จนกว่าจะมีสองคอมโพเนนต์ที่ไม่ได้เป็น parent กับ child ต้องใช้ข้อมูลชุดเดียวกัน ตอนนั้นคุณต้องการ shared state และ Svelte มีให้สองคำตอบ:

  • runes ใน module เอา $state ไปไว้ในไฟล์ .svelte.js / .svelte.ts แล้ว export ออกมา ทุกคอมโพเนนต์ที่ import จะอ่านและเขียนค่า reactive ตัวเดียวกัน นี่คือ default สมัยใหม่ใน Svelte 5
  • stores primitive แบบดั้งเดิมของ Svelte: object ที่มี method subscribe โดยมี writable, readable และ derived จาก svelte/store ครอบคลุมงานส่วนใหญ่ และ syntax $store จะ auto-subscribe ให้ในคอมโพเนนต์ ยังรองรับเต็มที่ — และ contract ที่อยู่เบื้องหลังคือสิ่งที่ทำให้ Svelte ทำงานร่วมกับอะไรอย่าง RxJS ได้
บทเรียนสิ่งที่จะได้เรียน
The store contract”store” จริง ๆ คืออะไร: object ใด ๆ ที่มี subscribe
Built-in storeswritable, readable, derived และ prefix $
Runes vs storesการเปลี่ยนแปลงใน Svelte 5 และเมื่อไรควรใช้อะไร
Cross-component stateshare runed state อย่างปลอดภัย (module, context, SSR)
flowchart TB
  q["ต้อง share state ไหม"] --> local["ไม่: local state ในคอมโพเนนต์"]
  q --> shared["ใช่"]
  shared --> runes["runes ใน .svelte.js module (default)"]
  shared --> stores["stores: subscribe contract หรือ interop หรือ code เดิม"]
เลือกว่า shared state จะอยู่ที่ไหน

Svelte 5 ไม่ได้เอา stores ออก — แต่เพิ่มตัวเลือกที่ง่ายกว่าสำหรับเคสส่วนใหญ่ คุณจะได้เรียนทั้งสองอย่าง และที่สำคัญกว่าคือ เมื่อไร ที่แต่ละอย่างเป็นตัวเลือกที่ถูก

เมื่อไรที่คุณต้องการ shared state (เกินกว่า local `$state`)?
อะไรคือ default สมัยใหม่สำหรับ shared state ใน Svelte 5?
Svelte 5 เอา stores ออกไหม?