# Svelte ์
๋ฌธ ๊ฐ์ด๋
## ํ์ต ๋ชฉํ
์ปดํ์ผ ํ์ ํ๋ ์์ํฌ Svelte๋ก ๋น ๋ฅธ ์น์ฑ์ ๋ง๋ญ๋๋ค.
## 1. Svelte๋?
์ปดํ์ผ ํ์์ ์ต์ ํ๋๋ ํ๋ ์์ํฌ์
๋๋ค.
- ๊ฐ์ DOM ์์ด ์ง์ DOM ์กฐ์
- ๋ฒ๋ค ํฌ๊ธฐ๊ฐ ์์
- ๊ฐ๊ฒฐํ ๋ฌธ๋ฒ
- ๋ฐ์ด๋ ์ฑ๋ฅ
## 2. ํ๋ก์ ํธ ์์ฑ
```bash
npm create svelte@latest myapp
cd myapp
npm install
npm run dev
```
## 3. ์ปดํฌ๋ํธ ๊ธฐ์ด
```svelte
<script>
let name = "World";
</script>
<h1>Hello {name}!</h1>
<style>
h1 {
color: purple;
}
</style>
```
## 4. ๋ฐ์์ฑ (Reactivity)
```svelte
<script>
let count = 0;
// ๋ฐ์ํ ์ ์ธ
$: doubled = count * 2;
// ๋ฐ์ํ ๊ตฌ๋ฌธ
$: console.log("count changed:", count);
$: if (count > 10) {
alert("Too high!");
}
</script>
<button on:click={() => count++}>
Clicked {count} times
</button>
<p>Doubled: {doubled}</p>
```
## 5. Props
```svelte
<!-- Child.svelte -->
<script>
export let name;
export let age = 0; // ๊ธฐ๋ณธ๊ฐ
</script>
<p>{name} is {age} years old</p>
<!-- Parent.svelte -->
<script>
import Child from "./Child.svelte";
</script>
<Child name="Kim" age={25} />
```
## 6. ์ด๋ฒคํธ ์ฒ๋ฆฌ
```svelte
<script>
function handleClick(event) {
alert("Clicked!");
}
function handleInput(event) {
console.log(event.target.value);
}
</script>
<button on:click={handleClick}>Click me</button>
<button on:click|preventDefault={handleClick}>No default</button>
<input on:input={handleInput} />
```
## 7. ๋ฐ์ธ๋ฉ
```svelte
<script>
let name = "";
let checked = false;
let selected = "a";
</script>
<!-- ํ
์คํธ -->
<input bind:value={name} />
<p>Hello {name}</p>
<!-- ์ฒดํฌ๋ฐ์ค -->
<input type="checkbox" bind:checked />
<p>{checked ? "Yes" : "No"}</p>
<!-- ์
๋ ํธ -->
<select bind:value={selected}>
<option value="a">A</option>
<option value="b">B</option>
</select>
```
## 8. ์กฐ๊ฑด๋ฌธ๊ณผ ๋ฐ๋ณต๋ฌธ
```svelte
<script>
let show = true;
let items = ["Apple", "Banana", "Cherry"];
</script>
<!-- ์กฐ๊ฑด๋ฌธ -->
{#if show}
<p>Visible!</p>
{:else}
<p>Hidden</p>
{/if}
<!-- ๋ฐ๋ณต๋ฌธ -->
<ul>
{#each items as item, index}
<li>{index + 1}. {item}</li>
{/each}
</ul>
<!-- ํค ์ง์ -->
{#each items as item (item.id)}
<li>{item.name}</li>
{/each}
```
## 9. ์คํ ์ด (์ ์ญ ์ํ)
```javascript
// stores.js
import { writable, readable, derived } from "svelte/store";
export const count = writable(0);
export const time = readable(new Date(), set => {
const interval = setInterval(() => set(new Date()), 1000);
return () => clearInterval(interval);
});
export const doubled = derived(count, $count => $count * 2);
```
```svelte
<script>
import { count, doubled } from "./stores.js";
</script>
<p>Count: {$count}</p>
<p>Doubled: {$doubled}</p>
<button on:click={() => $count++}>+1</button>
```
## 10. ๋ผ์ดํ์ฌ์ดํด
```svelte
<script>
import { onMount, onDestroy, beforeUpdate, afterUpdate } from "svelte";
onMount(() => {
console.log("Component mounted");
return () => console.log("Cleanup on unmount");
});
onDestroy(() => {
console.log("Component destroyed");
});
</script>
```
## 11. SvelteKit ๋ผ์ฐํ
```
src/routes/
+page.svelte # /
about/+page.svelte # /about
blog/[slug]/+page.svelte # /blog/:slug
+layout.svelte # ๊ณตํต ๋ ์ด์์
```
```svelte
<!-- src/routes/blog/[slug]/+page.svelte -->
<script>
export let data;
</script>
<h1>{data.post.title}</h1>
```
```javascript
// src/routes/blog/[slug]/+page.js
export async function load({ params }) {
const post = await fetchPost(params.slug);
return { post };
}
```
## ์ถ์ฒ ํ์ต ์์
1. ๊ธฐ๋ณธ ๋ฌธ๋ฒ๊ณผ ๋ฐ์์ฑ
2. ์ปดํฌ๋ํธ์ Props
3. ์ด๋ฒคํธ์ ๋ฐ์ธ๋ฉ
4. ์คํ ์ด๋ก ์ํ ๊ด๋ฆฌ
5. SvelteKit์ผ๋ก ํ์คํ ์ฑ