logo hsb.horse
← Back to blog index

Blog

Consider strategy patterns when v-if branches increase in Vue

When there are three or more patterns of conditional branching using v-if, consider implementing a strategy pattern to dynamically switch components. Improved readability and maintainability.

Published:

It is often used in React, but it can also be achieved properly in Vue.

Main points

  • Think of patterns as being defined by strings
    • Example: API communication status: pending | resolve | reject
    • Example: SNS icon distribution: twitter | facebook | instagram | github | line
  • Create components for each pattern

implementation

<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>

Points

  • Object mapping: Mapping pattern strings and components
  • Dynamic component: Dynamically switched with <component :is="...">
  • Type Safety: Define patterns in TypeScript with Union Type

summary

If three or more branching patterns occur in v-if, consider a strategy pattern.

Dynamic components make templates cleaner and easier to add new patterns.