<component :is=""> 란 Vue에서 동적으로 컴포넌트를 렌더링하는 방법이다. 이 값은 세 가지 형태로 전달될 수 있다
아니다
<component :is /> 는 단순히 컴포넌트만 렌더링하는 것이 아니라, 더 유연한 렌더링을 지원한다. 세 가지 경우를 예제와 함께 정리해보자.
<template>
<component :is="currentComponent" />
</template>
<script setup>
import MyComponent from './MyComponent.vue'; // 별도 파일에서 불러온 컴포넌트
const currentComponent = ref('MyComponent');
// 컴포넌트를 등록해야 동작 (Nuxt에서는 자동 임포트 가능)
defineComponents({
MyComponent,
});
</script>
<template>
<div>
<component :is="dynamicComponent" />
</div>
</template>
<script setup>
const dynamicComponent = {
template: `<div>{{ message }}</div>`,
setup() {
return {
message: "직접 정의된 컴포넌트입니다!",
};
},
};
</script>
<template>
<div>
<component v-for="node in slotNodes" :key="node.props?.id" :is="node" />
</div>
</template>
<script setup>
import { useSlots } from 'vue';
const slots = useSlots();
const slotNodes = slots.default?.() || []; // 슬롯에서 VNode 배열 가져오기
</script>
VNode(가상 노드)는 Vue가 실제 DOM을 생성하기 전 사용하는 가상 DOM의 기본 단위이다. <template>나 render 함수가 컴파일되면 VNode로 변환.
<template>
<div>Hello</div>
</template>
위 코드는 다음과 같은 VNode로 변환:
{
"type": "div",
"props": {},
"children": "Hello"
}
<template>
<div>
<component :is="activeNode" />
</div>
</template>
<script setup>
import { useSlots, computed, ref } from 'vue';
const slots = useSlots();
const activeTab = ref('js');
const slotNodes = slots.default?.() || []; // VNode 배열
const activeNode = computed(() =>
slotNodes.find(node => node.props?.language === activeTab.value)
);
</script>
<CodeViewer>
<pre language="js">console.log("JS")</pre>
<pre language="py">print("Python")</pre>
</CodeViewer>
태그의 VNode 배열이고,는 선택된 VNode를 바로 렌더링. *Vue의 런타임 시점 기준