コンテンツにスキップ

v-ifによる分岐が3パターン以上ならストラテジーパターンを検討する

Reactではよく使うが、Vueでもちゃんと実現できる。

  • パターンを文字列で定義できるように考える
    • ex. APIの通信ステータス: pending | resolve | reject
    • ex. SNSアイコンの出し分け: twitter | facebook | instagram | github | line
  • パターンごとのコンポーネントをつくる
<script setup lang="ts">
import { computed, ref } from 'vue';
import TwitterIcon from './TwitterIcon.vue';
import FacebookIcon from './FacebookIcon.vue';
import InstagramIcon from './InstagramIcon.vue';
type IconType = "twitter" | "facebook" | "instagram";
const icons = {
twitter: TwitterIcon,
facebook: FacebookIcon,
instagram: InstagramIcon;
}
const iconType = ref<IconType>("twitter");
const currentIconComponent = computed(() => {
return icons[iconType.value]
})
// function showTwitterIcon
// function showFacebookIcon
// function showInstagramIcon
</script>
<template>
<div class="flex gap-1 m-4">
<button @click="showTwitterIcon">Twitter</button>
<button @click="showFacebookIcon">Facebook</button>
<button @click="showInstagramIcon">Instagram</button>
</div>
<component :is="currentIconComponent" />
</template>