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

React สู่ Svelte: Mental Model

คุณรู้วิธีคิดเรื่อง component, จัดการ state, handle event และประกอบ UI อยู่แล้ว ทักษะเหล่านี้ถ่ายทอดไปยัง Svelte ได้แทบทั้งหมด โมดูลนี้เน้นไปที่จุดที่ mental model เปลี่ยนจริง ๆ — และทำให้การเปลี่ยนแปลงเหล่านั้นรู้สึกชัดเจนแทนที่จะน่าแปลกใจ

  • Component boundaries — หนึ่งไฟล์ หนึ่ง component ประกอบกันด้วยการ nest เหมือน React ทุกประการ
  • Props ไหลลงมา — parent ส่งข้อมูลให้ child แนวคิดเหมือนกัน syntax ต่างกันเล็กน้อย
  • Event handler — ผูกฟังก์ชันกับ element แนวคิดเหมือนกัน ชื่อ event เป็น lowercase ใน Svelte
  • Conditional rendering — แสดง/ซ่อน UI ตาม state แนวคิดเดียวกัน syntax ต่างกัน
  • List rendering — วนลูปข้อมูลเพื่อสร้าง markup แนวคิดเดียวกัน Svelte ใช้ {#each} แทน .map()
  • Component lifecycle — logic สำหรับ setup และ teardown $effect แทน useEffect
  • Scoped styles — CSS ที่เป็นของ component นั้น ๆ React ต้องใช้ CSS Modules ส่วน Svelte ให้มาฟรี
แนวคิด Reactแนวคิด Svelte 5
State เป็น immutable — ต้องเรียก setter เพื่ออัปเดตState เป็น mutable — กำหนดค่าตรง ๆ Svelte จะตรวจจับการเปลี่ยนแปลง
Logic อยู่ใน JS; JSX คือ return valueLogic และ markup อยู่ในไฟล์ .svelte เดียว; ไม่มี return
React reconcile virtual DOM ที่ runtimeSvelte compile เป็น DOM update โดยตรงตอน build time
Children คือ children prop พิเศษChildren คือ snippet — template fragment ที่ type-safe และ callable

การเปลี่ยนแปลงทั้งสี่นี้ครอบคลุม 90% ของปัญหา “ทำไมมันไม่ทำงาน?” ที่คุณจะเจอในฐานะ React developer แต่ละ lesson ในโมดูลนี้เน้นไปที่ประเด็นใดประเด็นหนึ่ง

บทเรียนแนวคิด
หน้านี้ภาพรวมของสิ่งที่เปลี่ยนและสิ่งที่ยังเหมือนเดิม
Single-file componentsโครงสร้าง .svelte vs JSX + CSS Modules
Compiler vs runtimeSvelte กำจัด virtual DOM ได้อย่างไร
Reactivity overviewReactivity แบบ assignment vs setState
Scoped stylesAuto-scoped <style> vs CSS Modules
Same vs differentตารางอ้างอิงแบบ side-by-side
React
// Counter.jsx
import { useState } from 'react';
export default function Counter() {
const [count, setCount] = useState(0);
return (
<button onClick={() => setCount(c => c + 1)}>
Count: {count}
</button>
);
}
Svelte
<!-- Counter.svelte -->
<script>
let count = $state(0);
</script>
<button onclick={() => count++}>
Count: {count}
</button>

ทุกแนวคิดใน counter นั้น — state, event handler, การแสดงค่า — มีอยู่ทั้งสองฝั่ง syntax เพียงแค่ต่างกันเล็กน้อย รูปแบบนี้เกิดขึ้นซ้ำทั่วทั้งโมดูล

แนวคิดใดของ React ที่ไม่ถ่ายทอดไปยัง Svelte?
Svelte กำจัด virtual DOM ได้อย่างไร?
ใน Svelte 5 คุณอัปเดต state variable ชื่อ "score" ได้อย่างไร?