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

Same vs Different: ตารางอ้างอิง

หน้านี้คือ cheat sheet ของคุณ ทุก React concept สำคัญ map ไปยัง Svelte equivalent — หลายอย่าง intent เกือบเหมือนกัน ต่างกันแค่ syntax บางส่วนต้องการ mental model shift จริง ๆ ทั้งสองประเภทอยู่ที่นี่

ReactSvelte 5หมายเหตุ
function Component()ไฟล์ .svelteไฟล์คือ component — ไม่ต้องมี function wrapper
JSX return (...)Markup bodyไม่มี return ไม่มี parens — template คือ file body
export default functionไฟล์คือ exportไม่ต้อง export ด้วยตนเอง
className="foo"class="foo"HTML attribute จริง — ไม่ต้องเปลี่ยนชื่อ
Function prop arguments ({ name })let { name } = $props()Rune-based prop declaration
useState(init)$state(init)Direct mutation แทน setter function
useMemo(() => x, [deps])$derived(x)Auto-tracked ไม่มี dependency array
useEffect(() => {}, [deps])$effect(() => {})Auto-tracked cleanup ผ่าน return function
useCallback(fn, [deps])Plain function (ไม่มี equivalent)Function ไม่ถูก re-create ในแต่ละ update
useRef(null)let el = $state(null) / bind:this={el}bind:this bind กับ DOM element
useContext / createContextSvelte stores / setContext / getContextContext API มีอยู่; store นิยมใช้สำหรับ reactivity
children prop{@render children()} snippetSnippet คือ typed template fragment ไม่ใช่ value
Named slot / render prop{#snippet name()} / {@render name()}Explicit และ type-safe กว่า render prop
onClickonclickLowercase, plain HTML event attribute
onChangeoninputoninput fire ทุก keystroke; onchange fire ตอน blur
onKeyDownonkeydownEvent name ทั้งหมดเป็น lowercase ใน Svelte 5
<input value={x} onChange={fn}bind:value={x}Two-way binding แทน controlled-input pattern
CSS Modules / styled-components<style> blockAuto-scoped zero config
clsx(a, { b: cond })class:b={cond}Built-in conditional class directive
React Router / next/linkSvelteKit <a href> / goto()SvelteKit จัดการ routing; plain anchor ใช้ได้
useNavigateimport { goto } from '$app/navigation'SvelteKit navigation API
useSearchParamsimport { page } from '$app/stores'$page.url.searchParams
<Suspense> / lazy{#await} blockBuilt-in ใน template language
React.memoไม่จำเป็นSvelte ไม่ re-run component ทั้งหมดตอน update
Create React AppVite (+ @sveltejs/vite-plugin-svelte)CRA deprecated; Vite คือมาตรฐาน
Next.jsSvelteKitFull-stack framework: SSR, routing, API routes
React
// React — must be immutable
const [items, setItems] = React.useState([]);
function addItem(item) {
setItems([...items, item]); // spread, never push
}
Svelte
<script>
// Svelte — direct mutation is tracked
let items = $state([]);
function addItem(item) {
items.push(item); // push is fine — Svelte detects it
}
</script>

React hook มีกฎเข้มงวด: เรียกที่ top level เท่านั้น ห้ามอยู่ใน condition หรือ loop ต้องเรียกในลำดับเดิมเสมอ Svelte rune ไม่มีข้อจำกัดเหล่านี้ — คุณสามารถเรียก $state ใน condition หรือใน loop ก็ได้ เพราะ rune คือ compiler directive ไม่ใช่ function call ที่ถูกติดตามตาม call order

React
// React — hooks must be at the top level, always called
function Conditional({ show }) {
// RULE: can't put hooks inside an if — even though it's unused
const [x, setX] = React.useState(0);
if (!show) return null;
return <button onClick={() => setX(x + 1)}>{x}</button>;
}
Svelte
<script>
let { show } = $props();
// Runes can be declared anywhere — no ordering rules
let x = $state(0);
</script>
{#if show}
<button onclick={() => x++}>{x}</button>
{/if}
Equivalent ของ React useState ใน Svelte 5 คืออะไร?
Pattern ใดของ React ที่ "bind:value" ของ Svelte แทนที่?
คุณสามารถเรียก Svelte $state rune ภายใน if-block หรือ loop ได้ไหม?
Equivalent ของ Next.js ใน Svelte คืออะไร?