Reactivity Overview
Reactivity ของ React สร้างบน immutability — คุณไม่เคย mutate state โดยตรง; คุณเรียก setter และ React จัดตาราง re-render Reactivity ของ Svelte 5 สร้างบน rune และ direct assignment — คุณประกาศ state ด้วย $state() แล้ว mutate ได้เหมือน JavaScript variable ทั่วไป compiler ของ Svelte ตรวจจับการ assign และ emit โค้ด DOM update ทั้งสองโมเดลให้ผลลัพธ์เหมือนกัน แต่ feel ต่างกันมาก
ประกาศ state
หัวข้อที่มีชื่อว่า “ประกาศ state”function Counter() { // Must call useState — raw let gives a stale value const [count, setCount] = React.useState(0); return <p>Count: {count}</p>;}<script> // $state() marks this as reactive — plain let is not tracked let count = $state(0);</script>
<p>Count: {count}</p>อัปเดต state
หัวข้อที่มีชื่อว่า “อัปเดต state”function Counter() { const [count, setCount] = React.useState(0); // Must call the setter — mutating count directly does nothing return ( <button onClick={() => setCount(c => c + 1)}> {count} </button> );}<script> let count = $state(0); // Direct mutation — no setter needed</script>
<button onclick={() => count++}> {count}</button>Derived / computed value
หัวข้อที่มีชื่อว่า “Derived / computed value”ใน React คุณใช้ useMemo เพื่อหลีกเลี่ยงการคำนวณซ้ำในทุก render ใน Svelte 5 คุณใช้ $derived — ไม่มี dependency array ไม่มี hook rule แค่ expression
function ShoppingCart({ items }) { const total = React.useMemo( () => items.reduce((sum, item) => sum + item.price, 0), [items] // <-- must list every dependency manually ); return <p>Total: ${total}</p>;}<script> let { items } = $props(); // Dependencies tracked automatically — no array needed let total = $derived( items.reduce((sum, item) => sum + item.price, 0) );</script>
<p>Total: ${total}</p>Side effect
หัวข้อที่มีชื่อว่า “Side effect”useEffect กลายเป็น $effect การเปลี่ยนแปลงที่ยินดีที่สุด: ไม่มี dependency array Svelte ติดตาม $state variable ที่ effect ของคุณอ่านและ re-run โดยอัตโนมัติเมื่อมีการเปลี่ยนแปลง
function TitleUpdater({ title }) { React.useEffect(() => { document.title = title; // Must list title in the array or the effect goes stale }, [title]); return null;}<script> let { title } = $props(); // Runs when title changes — Svelte tracks it automatically $effect(() => { document.title = title; // Return a cleanup function just like useEffect return () => { document.title = 'App'; }; });</script>