가수면

[Svelte] 기본 본문

웹 개발/웹 개발

[Svelte] 기본

니비앙 2024. 5. 28. 18:02

상태 관리

Svelte는 let 변수가 변경될 때마다 이를 사용하는 모든 부분이 그냥 자동으로 업데이트된다.

예시 코드1)

<script lang="ts">
    let count = 0;

    $: console.log('count가 변경되었습니다:', count);
    
    function increment() {
        count += 1;
    }
</script>

<button on:click={increment}>
    Clicked {count} times
</button>

예시 코드2)

name 변수가 변경될 때마다 greeting 변수도 자동으로 업데이트 됨

<script lang="ts">
    let name = 'World';

    $: greeting = `Hello, ${name}!`;
</script>

<input bind:value={name} />
<p>{greeting}</p>

전역 상태 관리

writable을 그냥 export해서 사용하면 됨

 

import { writable } from 'svelte/store';

export const count = writable(0);

사용법

  • .set(): 스토어의 값을 설정합니다.
  • .update(): 현재 값을 기반으로 새로운 값을 설정하는 함수를 받습니다.
  • .subscribe(() => {}): 스토어의 값이 변경될 때마다 호출될 콜백 함수를 등록합니다.
  • get(상태값): 스토어의 현재 값을 반환
  • $상태값: 변경 시마다 동적으로 값을 반환

예시 코드)

<script lang="ts">
    import { count } from './store';
</script>

<button on:click={() => $count.update(n => n + 1)}>
    Clicked {$count} times
</button>

동적 렌더링

조건문으로 분기 렌더링

1. 단순 조건문

            {#if chat.type === 'modelfiles'}
                <Modelfiles />
            {:else if chat.type === 'prompts'}
                <Prompts />
            {:else if chat.type === 'documents'}
                <Documents />
            {/if}

2. 반목문

{#each 배열 as 요소, 인덱스 (키)}
	<!-- 반복할 내용 -->
{:else}
	<li>아이템이 없습니다.</li>
{/each}

3. 필터

{#each $chats.filter((chat) => { ... }) as chat, i}
	<!-- chat 요소와 인덱스 i를 사용하여 반복할 내용 -->
{/each}

4. <svelte:component>

컴파일 타임에 결정되지 않고 런타임에 컴포넌트를 동적으로 선택하여 렌더링해야 할 때 유용 (svelte는 빌드 시점에 렌더링이 되는 방식)

<script lang="ts">
    import Modelfiles from './Modelfiles.svelte';
    import Prompts from './Prompts.svelte';
    import Documents from './Documents.svelte';

    const chats = writable([]);

    const componentMap = {
        modelfiles: Modelfiles,
        prompts: Prompts,
        documents: Documents
    };
</script>

<div>
    {#each $chats as chat}
        <div>
            {#if chat.type in componentMap}
                <!-- 컴포넌트 맵에서 chat.type에 해당하는 컴포넌트를 동적으로 렌더링 -->
                <svelte:component this={componentMap[chat.type]} />
            {/if}

 

'웹 개발 > 웹 개발' 카테고리의 다른 글

yarn 오류  (0) 2024.06.23
JPA와 MyBatis  (0) 2024.06.07
Vercel의 배포 방식과 느릴 수밖에 없는 이유  (1) 2024.04.12
조회수 어뷰징 방지 방법들  (0) 2024.04.11
SQL 쿼리  (0) 2024.03.27
Comments