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

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 ต่างกันมาก

React
function Counter() {
// Must call useState — raw let gives a stale value
const [count, setCount] = React.useState(0);
return <p>Count: {count}</p>;
}
Svelte
<script>
// $state() marks this as reactive — plain let is not tracked
let count = $state(0);
</script>
<p>Count: {count}</p>
React
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>
);
}
Svelte
<script>
let count = $state(0);
// Direct mutation — no setter needed
</script>
<button onclick={() => count++}>
{count}
</button>

ใน React คุณใช้ useMemo เพื่อหลีกเลี่ยงการคำนวณซ้ำในทุก render ใน Svelte 5 คุณใช้ $derived — ไม่มี dependency array ไม่มี hook rule แค่ expression

React
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>;
}
Svelte
<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>

useEffect กลายเป็น $effect การเปลี่ยนแปลงที่ยินดีที่สุด: ไม่มี dependency array Svelte ติดตาม $state variable ที่ effect ของคุณอ่านและ re-run โดยอัตโนมัติเมื่อมีการเปลี่ยนแปลง

React
function TitleUpdater({ title }) {
React.useEffect(() => {
document.title = title;
// Must list title in the array or the effect goes stale
}, [title]);
return null;
}
Svelte
<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>
อัปเดต $state variable ใน Svelte 5 อย่างไร?
Equivalent ของ React useEffect พร้อม dependency array ใน Svelte 5 คืออะไร?
ทำไม Svelte $derived ถึงไม่ต้องการ dependency array เหมือน React useMemo?