Web/JavaScript

[Svelte] Template Syntax

llHoYall 2022. 12. 10. 16:28

이번에는 markup 영역에서 조건문, 반복문 등을 사용하는 방법에 대해 살펴보겠습니다.

#if

다음 예제와 함께 조건문의 사용에 대해 살펴봅시다.

<script lang="ts">
  let score = 80;
</script>

<div>
  {#if score >= 90}
    <span>Grade: A</span>
  {:else if score >= 80}
    <span>Grade: B</span>
  {:else}
    <span>Grade: C</span>
  {/if}
</div>

조건문의 경우 아주 간단하죠? 몇 가지 문법적 요소만 기억하시면 쉽게 사용하실 수 있습니다.

#each

이번엔 반복문의 사용에 대해 살펴봅니다.

<script lang="ts">
  let nums = [1, 2, 3];
  let persons = [
    { name: 'Kim', age: 18 },
    { name: 'Lee', age: 23 },
    { name: 'Park', age: 27 }
  ];
  let empty: number[] = [];
</script>

<ul>
  {#each nums as num}
    <li>{num}</li>
  {/each}
</ul>

<ul>
  {#each nums as num, idx}
    <li>{idx}: {num}</li>
  {/each}
</ul>

<ul>
  {#each persons as person (person.name)}
    <li>{person.name}, {person.age}</li>
  {/each}
</ul>

<ul>
  {#each persons as { name, age }}
    <li>{name}, {age}</li>
  {/each}
</ul>

<ul>
  {#each empty as elem}
    <li>{elem}</li>
  {:else}
    <li>Empty</li>
  {/each}
</ul>

반복문의 경우 조금 더 복잡합니다.

첫 번째 부터 살펴보면 기본 문법은 간단히 사용할 수 있습니다.

인덱스를 받을 수도 있고, 인덱스는 0부터 시작합니다.

()를 사용하여 key로 사용할 값을 받을 수 있습니다. Key는 unique한 값이어야 하며, 요소의 구분을 위해 사용됩니다.

다음으로 객체 destructuring을 사용할 수 있습니다.

마지막으로 else 구문을 사용하여, 유효하지 않을 경우의 error 처리를 할 수 있습니다.

#await

이번엔 비동기적 호출에 대해 살펴볼게요.

<script lang="ts">
  let page = 1;
  let limit = 10;

  $: items = fetch(
    `https://jsonplaceholder.typicode.com/posts?_page=${page}&_{limit=${limit}`
  ).then((res) => res.json());

  function nextPage() {
    page += 1;
  }
</script>

<header><div><h1>REST API Page</h1></div></header>
<div><div><span>Page: {page}</span></div></div>
<div>
  {#await items}
    <p>Loading...</p>
  {:then items}
    <ul>
      {#each items as item, idx}
        <li>
          <p>[{item.id}] {item.title}</p>
        </li>
      {/each}
    </ul>
  {:catch err}
    <p>Error!!!</p>
  {/await}
  <a href="#null" on:click={nextPage}>Next Page</a>
</div>

State 값을 기다렸다가 비동기적으로 처리를 합니다.

Promise나 await/async와 동일하니 쉽게 사용하실 수 있을 거에요.

#key

마지막으로 key block에 대해 살펴보겠습니다.

<script lang="ts">
  import { fade } from 'svelte/transition';

  let value = false;

  function changeValue() {
    value = !value;
  }
</script>

{#key value}
  <div transition:fade>{value}</div>
{/key}
<button on:click={changeValue}>Change</button>

Key block에 선언한 expression이 변할 때마다, content를 파괴 후 재생성 합니다.

State value가 변할 때마다, transition을 실행시키거나 할 때 유용하게 사용할 수 있습니다.

또, component에 적용할 경우, 매번 다시 초기화를 합니다.

Wrap Up

이번 포스팅에서는 template syntax들에 대해 살펴보았습니다.

Svelte로 개발 시 정말 많이 사용되는 문법들이니 잘 살펴보세요.