Svelte 해보기

기본 문법

Nested components

<script>
  // svelte 컴포넌트를 임포트 하기
	import Nested from './Nested.svelte';
</script>

<p>This is a paragraph.</p>
<Nested/>

<style>
	p {
		color: purple;
		font-family: 'Comic Sans MS', cursive;
		font-size: 2em;
	}
</style>

변수 변경

react에선 state를 써야하지만 svelte에선 값을 바로 변환하면 됨

<script>
	let count = 0;

	function incrementCount() {
		count += 1;
	}
</script>

<button on:click={incrementCount}>
	Clicked {count} {count === 1 ? 'time' : 'times'}
</button>

Reactivity

아래와 같은 Reactivity 문법을 통해 변수가 변하는 것을 감지하고 다른 반응을 할 수 있음.

$: doubled = count * 2;

$: {
	console.log('the count is ' + count);
	alert('I SAID THE COUNT IS ' + count);
}

svelte의 Reactivity는 assignment를 통해서만 반응함. 변수에 값을 =연산자로 재지정해야함.

function addNumber() {
	numbers.push(numbers.length + 1);
	numbers = numbers;
}

numbers = [...numbers, numbers.length + 1];

Props

변수 export

export let answer

<Nested answer={42} />

Logic

{#if x > 10}
	<p>{x} is greater than 10</p>
{:else if 5 > x}
	<p>{x} is less than 5</p>
{:else}
	<p>{x} is between 5 and 10</p>
{/if}

foreach

<ul>
	{#each cats as { id, name }, i}
		<li><a target="_blank" href="https://www.youtube.com/watch?v={id}" rel="noreferrer">
			{i + 1}: {name}
		</a></li>
	{/each}
</ul>

id

어떤 노드를 선택할지 정확히 알고 싶다면 아래와 같이 (thing.id)를 사용해야한다. https://svelte.dev/tutorial/keyed-each-blocks

{#each things as thing (thing.id)}
	<Thing name={thing.name}/>
{/each}

비동기

await promise를 사용해 비동기 처리를 할 수 있다.

<script>
	async function getRandomNumber() {
		const res = await fetch(`/tutorial/random-number`);
		const text = await res.text();

		if (res.ok) {
			return text;
		} else {
			throw new Error(text);
		}
	}

	let promise = getRandomNumber();

	function handleClick() {
		promise = getRandomNumber();
	}
</script>

<button on:click={handleClick}>
	generate random number
</button>

{#await promise}
	<p>...waiting</p>
{:then number}
	<p>The number is {number}</p>
{:catch error}
	<p style="color: red">{error.message}</p>
{/await}