Luvit νλ¬ μ€ν°λ
μ΄λ²μ£Όλ 3λΆ(9μ₯ νΌ κ΄λ ¨ μμ λ°μΈλ© ~ 14μ₯ μ€ν μ΄)λ₯Ό 곡λΆνλ€.

βοΈνΌ κ΄λ ¨ μμ λ°μΈλ©
λ°μΈλ©
μνκ°κ³Ό κ·Έ κ°μ μ μ΄νλ μμλ₯Ό κ²°ν©νλ κ²
λ°μΈλ©μ bind: λ₯Ό μ¬μ©νμ¬ HTML μμμ κ°κ³Ό Javascript λ³μλ₯Ό μλμΌλ‘ λκΈ°ννλ κ²μ΄λ€. λ°μΈλ©μ ν¬κ² λ¨λ°©ν₯ λ°μΈλ©κ³Ό μλ°©ν₯ λ°μΈλ©μ΄ μλ€.
- λ¨λ°©ν₯ λ°μΈλ©:μμκ° μνκ°μ μ§μ λ³νμν€μ§ λͺ»νλ€(props).
- μλ°©ν₯ λ°μΈλ©: μ λ ₯κ³Ό μΆλ ₯μ΄ λμμ λ³κ²½λλλ‘ μ²λ¦¬νλ€. μ¦, μ λ ₯ μμμ κ°μ μ λ ₯νλ©΄ κ·Έμ μ°κ²°λ κ°λ€λ μλμΌλ‘ μ λ°μ΄νΈλλ€.
μ€λ²¨νΈμμλ νΌ λ°μ΄ν° μ μ΄ μ μλ°©ν₯ λ°μΈλ©μ μ¬μ©νλ€.μ¬μ©μκ° μ λ ₯ νλμ κ°μ μ λ ₯νλ©΄ μ°κ²°λ λ³μκ° μ¦μ μ λ°μ΄νΈλκ³ , λ°λλ‘ λ³μκ° λ³κ²½λλ©΄ UIκ° μλμΌλ‘ κ°±μ λλ€. μ΄λ λ€λ₯Έ νλ μμν¬μμ μλμΌλ‘ μ΄λ²€νΈ 리μ€λλ₯Ό μ€μ νκ³ μνλ₯Ό κ΄λ¦¬ν΄μΌ νλ λ²κ±°λ‘μμ ν¬κ² μ€μ¬μ€λ€!
<νκ·Έ μμ bind:νκ·Έμμ±={μνκ°} />
μ λ ₯ μμ κ΄λ ¨ λ°μΈλ©
λ€μν μ λ ₯ μμ(ν μ€νΈ, 체ν¬λ°μ€, λΌλμ€ λ²νΌ λ±)μ λ°μΈλ© μμ±μ μ¬μ©ν μ μλ€.
Svelteλ HTML μ λ ₯ μμμ νΉμ±μ λ°λΌ μλ‘ λ€λ₯Έ λ°μΈλ© μμ±μ μ 곡νλ€. ν μ€νΈ μ λ ₯μλ bind:value, 체ν¬λ°μ€μλ bind:checked, λΌλμ€ λ²νΌμλ bind:groupμ μ¬μ©νλ€. μ΄λ° νμ λ³ λ°μΈλ©μ κ° μμμ λ€μ΄ν°λΈ λμμ κ·Έλλ‘ νμ©νλ©΄μλ, μν κ΄λ¦¬λ₯Ό λ¨μννλ€.
<script>
let text = '';
let isChecked = false;
let selectedOption = '';
let textarea = '';
</script>
<input type="text" bind:value={text} />
<input type="checkbox" bind:checked={isChecked} />
<input type="radio" bind:group={selectedOption} value="option1" />
<input type="radio" bind:group={selectedOption} value="option2" />
<textarea bind:value={textarea}></textarea>
<div>
<p>ν
μ€νΈ: {text}</p>
<p>체ν¬λ¨: {isChecked}</p>
<p>μ νλ μ΅μ
: {selectedOption}</p>
<p>ν
μ€νΈ μμ: {textarea}</p>
</div>

μ ν μμ κ΄λ ¨ λ°μΈλ©
select μμμμ λ¨μΌ μ νκ³Ό λ€μ€ μ ν λͺ¨λ bind:valueλ‘ μ²λ¦¬ν μ μλ€.
Select μμμ λ°μΈλ©μ λ¨μΌ μ νκ³Ό λ€μ€ μ ν λͺ¨λμ λ°λΌ λ€λ₯΄κ² λμνλ€. λ¨μΌ μ ν λͺ¨λμμλ μ νλ κ°μ΄ λ¬Έμμ΄λ‘ λ°μΈλ©λκ³ , λ€μ€ μ ν λͺ¨λ(multiple μμ±)μμλ μ νλ κ°λ€μ΄ λ°°μ΄λ‘ λ°μΈλ©λλ€.
<script>
let selected = '';
let multiSelected = [];
let options = ['μ¬κ³Ό', 'λ°λλ', 'μ€λ μ§', 'ν¬λ'];
</script>
<!-- λ¨μΌ μ ν -->
<select bind:value={selected}>
<option value="">μ ννμΈμ</option>
{#each options as option}
<option value={option}>{option}</option>
{/each}
</select>
<!-- λ€μ€ μ ν -->
<select multiple bind:value={multiSelected}>
{#each options as option}
<option value={option}>{option}</option>
{/each}
</select>
<p>μ νλ νλͺ©: {selected}</p>
<p>λ€μ€ μ νλ νλͺ©: {multiSelected.join(', ')}</p>

πͺ’κΈ°ν μμ λ°μΈλ©
each λΈλ‘ λ°μΈλ©
λ°λ³΅ λΈλ‘ λ΄μμ κ° νλͺ©μ μμ±μ κ°λ³μ μΌλ‘ λ°μΈλ©νμ¬ λͺ©λ‘ λ°μ΄ν°λ₯Ό ν¨κ³Όμ μΌλ‘ κ΄λ¦¬ν μ μλ€
each λΈλ‘ λ΄μμ λ°μΈλ©μ νλ©΄ λͺ©λ‘μ κ° νλͺ©μ λ 립μ μΌλ‘ μ μ΄ν μ μλ€. κ° νλͺ©μ μν λ³νκ° λ€λ₯Έ νλͺ©μ μν₯μ μ£Όμ§ μμΌλ©΄μλ μ 체 λͺ©λ‘μ μνλ₯Ό μ€μκ°μΌλ‘ μΆμ ν μ μλ€.
<script>
let items = [
{ id: 1, name: 'νλͺ©1', completed: false },
{ id: 2, name: 'νλͺ©2', completed: true },
{ id: 3, name: 'νλͺ©3', completed: false }
];
</script>
{#each items as item}
<div>
<input type="checkbox" bind:checked={item.completed} />
<input type="text" bind:value={item.name} />
<span>{item.completed ? 'μλ£' : 'λ―Έμλ£'}</span>
</div>
{/each}
<p>μλ£λ νλͺ©: {items.filter(item => item.completed).length}</p>

λ©ν°λ―Έλμ΄ μμ λ°μΈλ©
λΉλμ€μ μ€λμ€ μμμ μ¬μ μν, λ³Όλ₯¨, μ§ν μκ° λ±μ λ°μΈλ©νμ¬ μ»€μ€ν λ―Έλμ΄ νλ μ΄μ΄λ₯Ό ꡬνν μ μλ€.

μ½κΈ° μ μ© μμ±
| μμ± | μ€λͺ |
| iduration | μ΄ μ¬μ κΈΈμ΄(μ΄) |
| buffered | {start, end} κ°μ²΄λ€μ λ°°μ΄λ‘, λ²νΌ λ μμΉ νμ |
| seekable | {start, end} κ°μ²΄λ€μ λ°°μ΄λ‘, μμΉλ₯Ό μ°Ύμ μ μλ λ²μ νμ |
| played | {start, end} κ°μ²΄λ€μ λ°°μ΄λ‘, μ¬μνλ μμΉλ€μ νμ |
| seeking | μ°Ύλ μ€μΈμ§λ₯Ό true/falseλ‘ νμ |
| ended | μ¬μμ΄ λλ¬λμ§λ₯Ό true/falseλ‘ νμ |
| videoWidth | video νκ·Έμ λλΉλ₯Ό λνλ(only video) |
| videoHeight | video νκ·Έμ λμ΄λ₯Ό λνλ(only video) |
μ½κ³ μ°κΈ° μμ±
| μμ± | μ€λͺ |
| currentTime | νμ¬ μ¬μ μμΉ(μ΄) |
| playbackRate | μ¬μ μλ |
| paused | μΌμ μ μ§λλμ§ true/falseλ‘ νμ |
| volume | μλ ν¬κΈ°(0~1) |
κ³΅κ° λ°μΈλ©
μμμ ν¬κΈ°μ μμΉ μ 보λ₯Ό λ°μΈλ©νμ¬ λ°μν λ μ΄μμ, λμ UIλ₯Ό ꡬνν μ μλ€.
λΈλ‘ λ 벨μ μμ(div, h1 λ±)λ€μ clientWidth, clientHeight, offsetWidth, offsetHeightλ₯Ό μ½κΈ° μ μ© μμ±μΌλ‘ λ°μΈλ© ν μ μλ€. κ³΅κ° λ°μΈλ©μ ν΅ν΄ μμμ ν¬κΈ° λ³νμ λ°λ₯Έ λ°μν λμμ ꡬννκ±°λ, μμμ μμΉλ₯Ό κΈ°λ°ν μνΈμμ©μ λ§λ€ μ μκ³ , νΉν μ°¨νΈ, κ·Έλν, λμ λ μ΄μμ λ±μμ μ μ©νκ² μ¬μ©λλ€.
<script>
let w;
let h;
let size = 20;
</script>
<p>κΈμ ν¬κΈ°λ₯Ό λ³κ²½ν΄λ³΄μΈμ</p>
<input type = "range" bind:value={size} min="10" max="100"/>
<p>κΈμ ν¬κΈ°: {size}px</p>
<div bind:clientWidth={w} bind:clientHeight={h}>
<span style = "font-size: {size}px">κΈμ</span>
</div>

bind:this λ°μΈλ©
DOM μμμ μ§μ μ κ·Όνμ¬ λ€μ΄ν°λΈ λ©μλλ₯Ό νΈμΆνκ±°λ μμ±μ μ‘°μν μ μλ€.
리μ‘νΈμ ref κ°μ κΈ°λ₯. ν¬μ»€μ€ μ€μ , μ€ν¬λ‘€ μμΉ μ‘°μ , μΊλ²μ€ μ‘°μ λ± μ§μ μ μΈ DOM μ‘°μμ΄ νμν μν©μμ μΈ μ μλ€. bind:thisλ₯Ό μ¬μ©νλ©΄ λͺ λ Ήμ΄ λ°μνλ μΈμ€ν΄μ€μμλ§ μλνκ² ν΄ μ μμμ μ²λ¦¬λλ λ¬Έμ κ° λ°μνμ§ μλλ€. μ»΄ν¬λνΈ μλͺ μ£ΌκΈ°λ₯Ό κ³ λ €ν΄μ μ¬μ©ν΄μΌ ν¨
<script>
let inputElement;
let canvasElement;
let ctx;
function focusInput() {
inputElement.focus();
}
function drawOnCanvas() {
if (canvasElement) {
ctx = canvasElement.getContext('2d');
ctx.fillStyle = 'red';
ctx.fillRect(10, 10, 100, 100);
}
}
</script>
<input bind:this={inputElement} placeholder="ν΄λ¦νμ¬ ν¬μ»€μ€" />
<button on:click={focusInput}>μ
λ ₯ νλ ν¬μ»€μ€</button>
<canvas bind:this={canvasElement} width="200" height="200"></canvas>
<button on:click={drawOnCanvas}>μΊλ²μ€μ 그리기</button>
μ»΄ν¬λνΈ λ°μΈλ©
μμ μ»΄ν¬λνΈμ λ³μλ ν¨μλ₯Ό λΆλͺ¨ μ»΄ν¬λνΈμμ λ°μΈλ©νμ¬ μ»΄ν¬λνΈ κ° ν΅μ μ ꡬνν μ μλ€.
μ΄μ μ 곡λΆν propsλ μμ μ»΄ν¬λνΈκ° λΆλͺ¨ μ»΄ν¬λνΈμ μν₯μ μ€ μ μμμ§λ§, μ»΄ν¬λνΈ λ°μΈλ© μ λΆλͺ¨μ μμ μ»΄ν¬λνΈ κ° μλ°©ν₯ ν΅μ μ΄ κ°λ₯ν΄μ§λ€. μμ μ»΄ν¬λνΈμμ exportλ‘ μ μΈλ λ³μλ ν¨μλ₯Ό λΆλͺ¨ μ»΄ν¬λνΈμμ λ°μΈλ©ν μ μκ³ , μ΄λ₯Ό ν΅ν΄ μ»΄ν¬λνΈ κ° μν λκΈ°νμ λ©μλ νΈμΆμ΄ κ°λ₯νλ€.
<!-- Child.svelte -->
<script>
export let value = '';
export let count = 0;
export function reset() {
value = '';
count = 0;
}
</script>
<input bind:value />
<button on:click={() => count++}>Count: {count}</button>
<!-- Parent.svelte -->
<script>
import Child from './Child.svelte';
let childValue = '';
let childCount = 0;
let childComponent;
</script>
<Child bind:value={childValue} bind:count={childCount} bind:this={childComponent} />
<p>μμ μ»΄ν¬λνΈ κ°: {childValue}</p>
<p>μμ μ»΄ν¬λνΈ μΉ΄μ΄νΈ: {childCount}</p>
<button on:click={() => childComponent.reset()}>리μ
</button>

π°μ€λ²¨νΈ slot
slotμ μ»΄ν¬λνΈ λ΄μ©(λ§ν¬μ )μ λμ μΌλ‘ μ£Όμ ν μ μλ νλ μ΄μ€νλ μν μ νλ€.
slot κΈ°λ³Έ μ¬μ©λ²
slotμ Reactμ children propsμ μ μ¬ν κΈ°λ₯μΌλ‘, μ»΄ν¬λνΈλ₯Ό μ¬μ¬μ© κ°λ₯ν ν νλ¦ΏμΌλ‘ λ§λ€μ΄μ€λ€. λΆλͺ¨ μ»΄ν¬λνΈμμ μμ μ»΄ν¬λνΈ νκ·Έ μ¬μ΄μ μμ±ν λ΄μ©μ΄ slot μμΉμ λ λλ§ λλ€. slotμ μ¬μ©νμ¬ λ μ΄μμκ³Ό wrapper μ»΄ν°λνΈλ₯Ό ν¨μ¨μ μΌλ‘ ꡬνν μ μλ€.
<!-- Card.svelte -->
<div class="card">
<header>
<h2>μΉ΄λ μ λͺ©</h2>
</header>
<main>
<slot></slot>
</main>
<footer>
<p>μΉ΄λ νλ¨</p>
</footer>
</div>
<!-- App.svelte -->
<script>
import Card from './Card.svelte';
</script>
<Card>
<p>μ΄ λ΄μ©μ΄ slotμ λ€μ΄κ°λλ€.</p>
<button>μ‘μ
λ²νΌ</button>
</Card>

- <slot></slot>μΌλ‘ λ΄μ© μ½μ μμΉλ₯Ό μ§μ νλ€.
- λΆλͺ¨ μ»΄ν¬λνΈμμ μμ νκ·Έ μ¬μ΄ λ΄μ©μ΄ slotμ λ λλ§λλ€.
fallback slot
slotμ κΈ°λ³Έκ°μ μ 곡νμ¬ λ΄μ©μ΄ μ λ¬λμ§ μμ λ νμλ λ체 컨ν μΈ λ₯Ό μ§μ ν μ μλ€.
<!-- Modal.svelte -->
<div class="modal">
<div class="modal-content">
<slot name="header">
<h2>κΈ°λ³Έ μ λͺ©</h2>
</slot>
<slot>
<p>λ΄μ©μ΄ μμ΅λλ€.</p>
</slot>
<slot name="footer">
<button>νμΈ</button>
</slot>
</div>
</div>
<!-- App.svelte -->
<script>
import Modal from './Modal.svelte';
</script>
<Modal>
<p>λ΄μ©μ΄ μμ΅λλ€.</p>
</Modal>


slot μ΄λ¦ μ€μ
μ¬λ¬κ°μ slotμ ꡬλΆνκΈ° μν΄ name μμ±μ μ¬μ©ν΄ λͺ λͺ λ slotμ λ§λ€ μ μλ€.
λͺ λͺ λ slotμ νλμ μ»΄ν¬λνΈμμ μ¬λ¬ κ°μ μ½ν μΈ μμμ μ μν λ μ¬μ©λλ€. κ° slotμ κ³ μ ν μ΄λ¦μ λΆμ¬νκ³ , λΆλͺ¨ μ»΄ν¬λνΈμμ slot μμ±μ μ¬μ©ν΄ νΉμ slotμ λ΄μ©μ μ λ¬ν μ μλ€.
<!-- App.svelte -->
<script>
import Layout from './Layout.svelte';
</script>
<Layout>
<h1 slot="header">μ¬μ΄νΈ μ λͺ©</h1>
<nav slot="sidebar">
<a href="/">ν</a>
<a href="/tutorial">μκ°</a>
</nav>
<div>λ©μΈ μ½ν
μΈ </div>
<p slot="footer">svelte</p>
</Layout>
<!-- Layout.svelte -->
<div class="layout">
<header>
<slot name="header"></slot>
</header>
<nav>
<slot name="sidebar"></slot>
</nav>
<main>
<slot></slot>
</main>
<footer>
<slot name="footer"></slot>
</footer>
</div>

slot props
slotμ λ°μ΄ν°λ₯Ό μ λ¬νμ¬ λΆλͺ¨ μ»΄ν¬λνΈμμ μμ μ»΄ν¬λνΈμ λ°μ΄ν°λ₯Ό νμ©ν μ μλ€.
slot propsλ μμ μ»΄ν¬λνΈμμ λΆλͺ¨ μ»΄ν¬λνΈλ‘ λ°μ΄ν°λ₯Ό μ λ¬νλ λ°©μμ΄λ€. μμ μ»΄ν¬λνΈμμ slotμ propsλ₯Ό μ λ¬νλ©΄, λΆλͺ¨μ»΄ν¬λνΈμμ let:μ μ¬μ©νμ¬ ν΄λΉ λ°μ΄ν°μ μ κ·Όν μ μλ€.
<!-- ItemList.svelte -->
<script>
export let items = [];
</script>
<div class="item-list">
{#each items as item, index}
<div class="item">
<slot {item} {index} isFirst={index === 0} isLast={index === items.length - 1}>
<p>{item.name}</p>
</slot>
</div>
{/each}
</div>
<!-- App.svelte -->
<script>
import ItemList from './ItemList.svelte';
let items = [
{ name: 'νλͺ© 1', price: 1000 },
{ name: 'νλͺ© 2', price: 2000 },
{ name: 'νλͺ© 3', price: 3000 }
];
</script>
<ItemList {items} let:item let:index let:isFirst let:isLast>
<div class="custom-item" class:first={isFirst} class:last={isLast}>
<h3>{item.name}</h3>
<p>κ°κ²©: {item.price}μ</p>
<p>μμ: {index + 1}</p>
</div>
</ItemList>

쑰건 κ΄λ ¨ slot
μ‘°κ±΄λΆ slotμ νΉμ μν©μμλ§ νμλλ slotμ ꡬννκ±°λ, slotμ λ΄μ©μ΄ μ 곡λμλμ§ νμΈνμ¬ λ μ΄μμμ μ‘°μ ν λ μ¬μ©λλ€. $$slots κ°μ²΄λ₯Ό ν΅ν΄ slotμ μ‘΄μ¬ μ¬λΆλ₯Ό νμΈν μ μλ€.
πλΌμ΄ν μ¬μ΄ν΄
onMount ν¨μ
μ»΄ν¬λνΈκ° DOMμ λ§μ΄νΈ λ ν μ€νλλ ν¨μ. μ΄κΈ°ν μμ μ μνν λ μ¬μ©νλ€.
onMountλ μ»΄ν¬λνΈκ° μ²μ DOMμ λ λλ§λ ν ν λ²λ§ μ€νλλ λΌμ΄νμ¬μ΄ν΄ ν μ΄λ€. API νΈμΆ, μ΄λ²€νΈ 리μ€λ λ±λ‘, νμ΄λ¨Έ μ€μ λ± μ»΄ν¬λνΈ μ΄κΈ°νμ νμν μμ μ μνν λ μ¬μ©λλ€.
onDestroy ν¨μ
μ»΄ν¬λνΈκ° DOMμμ μ κ±°λκΈ° μ μ€νλλ ν¨μλ‘, μ 리 μμ μ μνν λ μ¬μ©νλ€.
onDestroyλ μ»΄ν¬λνΈκ° DOMμμ μ κ±°λκΈ° μ§μ μ μ€νλλ λΌμ΄νμ¬μ΄ν΄ ν μ΄λ€. μ΄λ²€νΈ 리μ€λ μ κ±°, νμ΄λ¨Έ μ 리, ꡬλ ν΄μ λ± λ©λͺ¨λ¦¬ λμλ₯Ό λ°©μ§νκ³ λ¦¬μμ€λ₯Ό μ 리νλ μμ μ μ¬μ©λλ€.
beforeUpdate/afterUpdate ν¨μ
μ»΄ν¬λνΈκ° μ λ°μ΄νΈ λκΈ° μ , νμ μ€ν΄μ€λλ ν¨μλ€λ‘ μ λ°μ΄νΈ μ¬μ΄ν΄μ μ μ΄ν λ μ¬μ©νλ€.
beforeUpdateλ μ»΄ν¬λνΈμ μνκ° λ³κ²½λμ΄ DOMμ΄ μ λ°μ΄νΈλκΈ° μ§μ μ μ€νλκ³ , afterUpdateλ DOM μ λ°μ΄νΈκ° μλ£λ νμ μ€νλλ€.
tick ν¨μ
λ€μ λ§μ΄ν¬λ‘νμ€ν¬μμ DOMμ΄ μ λ°μ΄νΈ λλλ‘ λ³΄μ₯νλ ν¨μ. μν λ³κ²½ ν μ¦μ DOMμ μ κ·Όν λ μ¬μ©νλ€.
tick ν¨μλ μν λ³κ²½ ν DOM μ λ°μ΄νΈκ° μλ£λ λκΉμ§ κΈ°λ€λ¦¬λ Promiseλ₯Ό λ°ννλ€. λ€λ₯Έ λΌμ΄ν μ¬μ΄ν΄ ν¨μμ λ¬λ¦¬, μΈμ λ μ§ μ¬μ©ν μ μλ€.
π©οΈContext API
Context API
μ»΄ν¬λνΈ νΈλ¦¬μμ propsλ₯Ό μΌμΌμ΄ μ λ¬νμ§ μκ³ λ°μ΄ν°λ₯Ό 곡μ ν μ μλ κΈ°λ₯
Context APIλ λΆλͺ¨ μ»΄ν¬λνΈμμ μ€μ ν κ°μ μμ μ»΄ν¬λνΈμμ μ§μ μ κ·Όν μ μκ² νλ κΈ°λ₯μ΄λ€. μ΄λ₯Ό ν΅ν΄ props drilling λ¬Έμ λ₯Ό ν΄κ²°νκ³ , ν λ§, μ¬μ©μ μ 보, μ€μ λ± μ μμ μΌλ‘ νμν λ°μ΄ν°λ₯Ό ν¨μ¨μ μΌλ‘ κ΄λ¦¬ν μ μλ€.
μμ μ»΄ν¬λνΈμμ setComponentλ₯Ό μ¬μ©νμ¬ λ°μ΄ν°λ₯Ό μ€μ νκ³ , νμ μ»΄ν¬λνΈμμλ getContextλ₯Ό μ¬μ©νμ¬ ν΄λΉ λ°μ΄ν°λ₯Ό κ°μ Έμ€λ κ²μ΄ context API μ¬μ©μ κΈ°λ³Έ ν¨ν΄μ΄λ€.
dispatch
μμ μ»΄ν¬λνΈμμ λΆλͺ¨ μ»΄ν¬λνΈλ‘ μ΄λ²€νΈλ₯Ό μ λ¬νλ κΈ°λ₯
createEventDispatcherμ μ¬μ©ν΄ 컀μ€ν μ΄λ²€νΈλ₯Ό μμ±νκ³ , λΆλͺ¨ μ»΄ν¬λνΈμκ² μ λ¬ν μ μλ€.
import {createEventDispatcher} from 'svelte';
const dispatch = createEventDispatcher();
const μ΄λ²€νΈν¨μ = () => {
dispatch('λμ€ν¨μΉλͺ
', {
value: μ λ¬ν κ°,
message: 'μ λ¬ν λ©μμ§'
});
}
//λ§ν¬μ
<μ»΄ν¬λνΈλͺ
on:λμ€ν¨μΉλͺ
/>
πͺμ€ν μ΄
μ μμμ λ°μ΄ν°λ₯Ό μ λ¬λ°κ³ μΆκ±°λ, λ°μ΄ν° λ³κ²½μ μμ²ν λ μ¬μ©
writable μ€ν μ΄
μ½κΈ°, μ°κΈ° λͺ¨λ κ°λ₯ν λ°μν μν μ μ₯μ
writable μ€ν μ΄λ svelteμ κ°μ₯ κΈ°λ³Έμ μΈ μ€ν μ΄ νμ μΌλ‘, κ°μ μ μ₯νκ³ λ³κ²½ν μ μκ³ , κ°μ΄ λ³κ²½λ λ ꡬλ μλ€μκ² μλμΌλ‘ μλ¦Όμ 보λΈλ€.
import {writable} from 'svelte/store';
export const μ€ν μ΄λͺ
= writable(κΈ°λ³Έκ°);
//λ§ν¬μ
{$μ€ν μ΄λͺ
}
readable μ€ν μ΄
μ½κΈ° μ μ© μ€ν μ΄λ‘, μΈλΆμμ κ°μ λ³κ²½ν μ μκ³ λ΄λΆ λ‘μ§μ μν΄μλ§ κ°μ΄ μ λ°μ΄νΈλλ€.
readable μ€ν μ΄λ μκ°, λ§μ°μ€ μμΉ, μλ² μν λ± μΈλΆ μμ€ν μΌλ‘λΆν° μ€λ λ°μ΄ν°λ₯Ό λ€λ£° λ μ¬μ©νλ€. ꡬλ μκ° μμ λλ§ νμ±νλλ ꡬ쑰λ₯Ό κ°μ§κ³ μλ€.
readable(μ΄κΈ°κ°, function start (set) {
//μ΄κΈ° μ€ν μ΄κ° νΈμΆ μ μ½λ
return function stop() {
//μ€ν μ΄κ° μ κ±° μ μ½λ
};
});
derived μ€ν μ΄
νλ μ΄μμ μ€ν μ΄λ‘λΆν° κ³μ°λ κ°μ μ 곡νλ μ€ν μ΄
derived μ€ν μ΄λ κΈ°μ‘΄ μ€ν μ΄μ κ°μ κΈ°λ°μΌλ‘ μλ‘μ΄ κ°μ κ³μ°νλ μ€ν μ΄μ΄λ€. μλ³Έ μ€ν μ΄κ° λ³κ²½λ λ μλμΌλ‘ μ¬κ³μ°λλ€.
import {λ€λ₯Έ μ€ν μ΄, derived} from 'svelte/store';
export const derivedλͺ
= derived(κΈ°μ‘΄ μ€ν μ΄λͺ
, $κΈ°μ‘΄ μ€ν μ΄λͺ
=> $κΈ°μ‘΄ μ€ν μ΄λͺ
(λ³κ²½ μ½λ λ°ν));
컀μ€ν μ€ν μ΄
writeable μ€ν μ΄λ₯Ό νμ₯νμ¬ νΉλ³ν λ©μλλ₯Ό κ°μ§ μ¬μ©μ μ μ μ€ν μ΄λ₯Ό λ§λ€ μ μλ€.
컀μ€ν μ€ν μ΄λ κΈ°λ³Έ μ€ν μ΄μ set, update, subscribe λ©μλ μΈμ λλ©μΈ νΉνλ λ©μλλ₯Ό μΆκ°ν μ€ν μ΄μ΄λ€. 컀μ€ν μ€ν μ΄λ₯Ό ν΅ν΄ λ μ§κ΄μ μ΄κ³ μ¬μ¬μ© κ°λ₯ν μν κ΄λ¦¬ λ‘μ§μ ꡬνν μ μλ€.
//store.js
import {writable} from 'svelte/store';
const createCount = () => {
const {subscribe, set, update} = writable(0);
return {
subscribe,
increment: () => update(n => n + 1),
decrement: () => update(n => n - 1),
reset: () => set(0)
};
}
export const count = createCount();
<!--Custom.svelte-->
<script>
import {count} from './store.js';
</script>
<h1>νμ¬ κ°: {$count} </h1>
<button on:click={count.increment}>+</button>
<button on:click={count.decrement}>-</button>
<button on:click={count.reset}>리μ
</button>
<!--App.svelte-->
<script>
import Custom from './Custom.svelte';
</script>
<Custom />

μ€ν μ΄ λ°μΈλ©
μ λ ₯ μμμ μ€ν μ΄λ₯Ό μ§μ λ°μΈλ©νμ¬ μλ°©ν₯ λ°μ΄ν° νλ¦μ ꡬνν μ μλ€.
μ€ν μ΄ λ°μΈλ©μ μ λ ₯ μμμ μ€ν μ΄λ₯Ό μ§μ μ°κ²°νμ¬ μ¬μ©μ μ λ ₯μ΄ μ€ν μ΄μ μ¦μ λ°μλλλ‘ νλ κΈ°λ₯μ΄λ€. μ μ μνμ UI μμ κ° λκΈ°νλ₯Ό μ½κ² ꡬνν μ μλ€. writable μ€ν μ΄λ₯Ό μ¨μΌ νκ³ , set ν¨μκ° νμνλ€.
<!--store.js-->
import {writable, derived} from 'svelte/store';
export const name = writable('μ΄λ¦');
export const greeting = derived(
name,
$name => `μλ
~ ${$name}~`
);
<!--Binding.svelte-->
<script>
import {name, greeting} from './store.js';
</script>
<h1>{$greeting}</h1>
<input bind:value={$name}>
<!--App.svelte-->
<script>
import Binding from './Binding.svelte';
</script>
<Binding />

μ΄λ² μ£Όμ°¨λΆν°λ μ€μ΅ ννΈ λ€μ΄κ° μ€ μμλλ°...νμ°Έ λ¨μλ€. μΉ΄λ λλλ κ² λ§λ₯ λκ° 4λ±λΆ ν΄λ¨λλ λ€μμ£Όμ μ΄λ‘ + μ€μ΅κΉμ§ ν κ² λ무 λ§μμ‘λ€..
μ€λμ λ°μΈλ©λΆν° λΌμ΄ν μ¬μ΄ν΄, μ€ν μ΄κΉμ§ μ’ μ¬νμ μΈ κ°λ μ 곡λΆνλ€. μμ ν μμν κ°λ μ μλμ΄μ μ΄ν΄νλλ° μ΄λ ΅μ§ μμλλ°, μμ§ μ΄λ»κ² νμ©ν μ§ μ λ§€ν λλμ΄λ€π빨리 μ€μ΅νλ©΄μ κ°μ μ΅νλ΄μΌμ§
