반응형
단순히 v-for를 돌려서 <div>같은걸 보여주는게 아니라 컴포넌트를 보여줘야했음. 그리고 순서도 랜덤으로ㅇㅇ
1. 문제
<my1 v-if="model1.open"></my1>
<my2 v-if="model2.open"></my2>
만약에 html에 미리 이렇게 써놓고 숨겨놨다고 한다면, my2 다음에 my1을 보여주고 싶어도 무조건 저기에 써놓은 순서대로 my1이 위에있고 my2가 밑에 있게됨.
2. 컴포넌트를 넣어주는 방법
<template>
<component :is="line.component" :item="line.item"></component>
</template>
<script setup>
import { ref, markRaw } from "vue";
import my1 from "@/component/my1";
const line = ref([]);
line.value.push({
component: markRaw(my1),
item: "데이터"
});
</script>
html에 <component>와 그 안에 :is라는 요소를 넣어줌(:item은 그냥 데이터 전달용 props).
그리고 markRaw로 감싼 컴포넌트를 :is의 값으로 전달해주면 된다.
3. 컴포넌트를 넣어주는 방법(여러개)
<template>
<template v-for="line in lines">
<component :is="line.component" :item="line.item"></component>
</template>
</template>
<script setup>
import { ref, markRaw } from "vue";
import my1 from "@/component/my1";
import my2 from "@/component/my2";
const lines = ref([]);
lines.value.push({
component: markRaw(my1),
item: "데이터1"
});
lines.value.push({
component: markRaw(my2),
item: "데이터2"
});
</script>
위에꺼랑 다를건 없고 v-for를 추가해주고 여러 컴포넌트를 넣어주면 된다.
---
참고로 markRow로 넣은 component에서 watch가 안먹힐 경우 아래 포스팅 확인!
'vue' 카테고리의 다른 글
[vue3] dispatch에 await 쓰는 법 (0) | 2023.02.16 |
---|---|
[vue3] child component에 계속 변하는 값 전달하기 (0) | 2023.02.13 |
(0 , _common.default) is not a function (0) | 2023.02.08 |
[vue3] Elements in iteration expect to have 'v-bind:key' directives (0) | 2023.02.06 |
[vue3] ref로 받은 element가 null일때 (0) | 2023.02.03 |