Components
Component cơ bản

Hello {name}!

Cấu trúc Component
<script>Logic component (JS/TS)
MarkupTemplate HTML với {expressions}
<style>CSS có phạm vi (tự động giới hạn trong component)
<script context="module">Chạy một lần mỗi module, không phải mỗi instance
Reactivity
Gán giá trị có tính phản ứng
Khai báo có tính phản ứng

$: đánh dấu các khai báo và câu lệnh có tính phản ứng

Quy tắc Reactivity
Assignment triggerscount += 1 kích hoạt cập nhật; obj.x = 1 cũng vậy
Array mutationDùng arr = [...arr, item] (gán lại để kích hoạt)
$: declarationTự động tính lại khi các biến phụ thuộc thay đổi
$: statementChạy side effects có tính phản ứng
Props
Khai báo & Truyền Props

{greeting}, {name}!

Spread Props
Events
DOM Events
value = e.target.value} />
Event Modifiers
preventDefaultGọi e.preventDefault()
stopPropagationNgừng event bubbling
onceHandler chỉ kích hoạt một lần
selfChỉ khi event.target là chính phần tử đó
captureDùng capture phase
Component Events
Bindings
Binding hai chiều
Binding phần tử & Component
Các loại Binding
bind:valueGiá trị input/select/textarea
bind:checkedTrạng thái checkbox
bind:groupNhóm radio/checkbox
bind:thisTham chiếu phần tử DOM
bind:clientWidth/HeightKích thước phần tử chỉ đọc
Stores
Writable Store
// store.js import { writable } from "svelte/store"; export const count = writable(0); // Component — auto-subscribe with $
Phương thức Store
count.set(10); // set value count.update(n => n + 1); // update from current const unsub = count.subscribe(v => console.log(v));
Các loại Store
writable(val)Store đọc-ghi
readable(val, fn)Chỉ đọc, thiết lập bởi hàm start
derived(stores, fn)Tính toán từ các stores khác
$storeCú pháp auto-subscribe trong components
Transitions
Transitions tích hợp
{#if visible}
Fades in/out
Fly in, fade out
{/if}
Tùy chọn Transition
fadeOpacity từ 0 đến 1
flyHoạt ảnh offset x/y + opacity
slideTrượt vào/ra (chiều cao)
scalePhóng to và mờ dần
drawHoạt ảnh stroke SVG path
durationThời gian transition tính bằng ms
delayĐộ trễ trước khi bắt đầu
Slots
Slot mặc định & có tên
Default header Default content

Title

Body content goes here

Slot Props
{#each items as item} {/each}

{index}: {item.name}

Context
Set & Get Context
Context vs Stores
ContextPhạm vi theo cây component, không có tính phản ứng mặc định
StoresToàn cục, có tính phản ứng, có thể import mọi nơi
Context + StoreTruyền store qua context để có reactivity theo phạm vi
Cơ bản về SvelteKit
Routing theo file
src/routes/ +page.svelte about/+page.svelte blog/[slug]/+page.svelte
Hàm Load
// +page.js (runs on client & server) export async function load({ params, fetch }) { const res = await fetch(`/api/posts/${params.slug}`); return { post: await res.json() }; }
Các file quan trọng
+page.svelteComponent trang
+page.js / +page.tsHàm load phía client/universal
+page.server.jsLoad chỉ phía server / form actions
+layout.svelteWrapper layout dùng chung
+error.svelteTrang lỗi
+server.jsAPI endpoint (GET, POST, ...)