SvelteKit ブロックまとめ

# はじめに

`SvelteKit`のブロックについてまとめました。

* If
* Else
* Else if
* Each
* Key
* Await

## つかったもの

* Vite + SvelteKit + Typescript
    * Flowbite-svelte
    * tailwind css

UIコンポーネントには[Flowbite-svelte](https://flowbite-svelte.com/)を利用しました。
導入方法は前の記事で公開しています。

https://qiita.com/doyaseizin/items/6e7e8571cc6c3d7ad2e8

## If

```vue
<script lang="ts">
  import { Button } from "flowbite-svelte";

  let bool = true;
</script>

{#if bool}
	<Button color="blue" on:click={() => bool = !bool}>
		TRUE
	</Button>
{/if}

{#if !bool}
	<Button color="green" on:click={() => bool = !bool}>
		FALSE
	</Button>
{/if}
```

![if.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2985550/cfd20698-275e-bdf8-47fb-4964ab6d887d.gif)

## Else

```vue
<script lang="ts">
  import { Button } from "flowbite-svelte";

	let bool = true;
</script>

{#if bool}
	<Button color="blue" on:click={() => bool = !bool}>
		TRUE
	</Button>
{:else}
	<Button color="green" on:click={() => bool = !bool}>
		FALSE
	</Button>
{/if}
```
![if.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2985550/7cf78897-0ebc-341b-990e-2c4137123c70.gif)

## Else if

```vue
<script lang="ts">
  import { Button } from "flowbite-svelte";

	let color = 'blue';
</script>

{#if color === 'blue'}
	<Button color="blue" on:click={() => color = 'green'}>
		Blue
	</Button>
{:else if color === 'green'}
	<Button color="green" on:click={() => color = 'red'}>
		Green
	</Button>
{:else}
	<Button color="red" on:click={() => color = 'blue'}>
		Red
	</Button>
{/if}
```

![else if.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2985550/288565ae-7e92-c3b6-8e7e-7af457b02fb5.gif)

## Each

```vue
<script lang="ts">
	let Array = [ '田中', '鈴木', '佐藤'];
</script>

{#each Array as	name, index }
	<p>
		{index}: {name}
	</p>
{/each}
```

`index`を指定するときは↑のようにする

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2985550/9d88b712-23f5-72f8-84d3-9399c32d27e4.png)

## Key

```vue
{#key value}
    ・・・
{/key}
```

valueが変化すると中のブロックが再表示されます。
とある変化を拾い、再表示したいしたい時に使えそうです。

アニメーションで使ってみました。

```vue
<script lang="ts">
  import { Button, Select } from "flowbite-svelte";
  import { fly } from "svelte/transition";

  let duration = 200;

  let durations = [
    {value: 100, name: '早い'},
    {value: 500, name: '通常'},
    {value: 1000, name: '遅い'},
  ]
</script>

<div class="flex">
  {#key duration}
    <div class="w-1/5" in:fly={{ duration: duration, y: 200 }}>
      <Button color="light">
        登録
      </Button>
    </div>
  {/key}

  <Select class="w-4/5" items={durations} bind:value={duration} />
</div>  
```

![key.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2985550/5d8995e2-9a62-14e3-2b16-2995a222f1cf.gif)

## Await

普段Promiseを使っていると、ありがちなThenブロックが繋がりまくって可読性が低くなる現象をスッキリかけます
デモとして犬の画像をランダムに拾ってくるようにしました。

```vue
<script lang="ts">
  async function getDog() {
    const res = await fetch(`https://dog.ceo/api/breeds/image/random/1`);
    const text = await res.text();

    if (res.ok) {
      return JSON.parse(text).message[0]
    }
  }
</script>

{#await getDog()}
  <p>...waiting</p>
{:then url}
  <img src="{url}" width="200" alt="犬の画像">
{:catch error}
  <p style="color: red">{error.message}</p>
{/await}
```

かなりすっきりしますね！


![dog.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2985550/759b7598-5229-5b19-170e-db2132581726.gif)