React에서는 자주 사용하지만, Vue에서도 제대로 실현할 수 있다.
요점
- 패턴을 문자열로 정의할 수 있도록 생각
- 예: API 통신 상태:
pending | resolve | reject - 예 : SNS 아이콘 발행 :
twitter | facebook | instagram | github | line
- 예: API 통신 상태:
- 패턴별 컴포넌트 만들기
구현
<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>포인트
- 오브젝트 매핑: 패턴 문자열과 컴포넌트 매핑
- 동적 구성요소:
<component :is="...">에서 동적으로 전환 - 형 안전성: TypeScript에서 패턴을 Union Type으로 정의
요약
v-if에서 3 패턴 이상의 분기가 발생하면 전략 패턴을 고려합시다.
동적 구성 요소를 사용하면 템플릿이 깔끔하고 새로운 패턴을 추가 할 수 있습니다.
hsb.horse